针对JavaFiles.walk遇到异常错误后能否继续执行和javaerrorfile这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展android.support.v7.widget.Gr
针对Java Files.walk 遇到异常错误后能否继续执行和java errorfile这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展android.support.v7.widget.GridLayout上的java.lang.StackOverflowError $Axis $1.walk(GridLayout.java:131、Decoding VOX Files in C# (Converting VOX Files to WAV Files)、Files.copy 和 Files.write 的不同似乎两种方法都做同样的事情,两种方法都将 Multipart 文件保存到特定位置、Files.walkFileTree 与 Files.walk 在 Windows NTFS 上的性能等相关知识,希望可以帮助到你。
本文目录一览:- Java Files.walk 遇到异常错误后能否继续执行(java errorfile)
- android.support.v7.widget.GridLayout上的java.lang.StackOverflowError $Axis $1.walk(GridLayout.java:131
- Decoding VOX Files in C# (Converting VOX Files to WAV Files)
- Files.copy 和 Files.write 的不同似乎两种方法都做同样的事情,两种方法都将 Multipart 文件保存到特定位置
- Files.walkFileTree 与 Files.walk 在 Windows NTFS 上的性能
Java Files.walk 遇到异常错误后能否继续执行(java errorfile)
如何解决Java Files.walk 遇到异常错误后能否继续执行
这是我第一次在 Java 中使用 Files.walk,我更喜欢它,尤其是 Path 类。它功能强大且用途广泛。
然而,我不喜欢的是,当遍历文件夹时,如果迭代器遇到障碍......就像它击中了用户无权查看的文件夹或可能遇到的任何错误,抛出异常后,它不会继续,也不会产生要使用的路径列表。
以下是我如何使用该方法的示例:
try {
Stream<Path> paths = Files.walk(rootPath);
List<Path> pathList = paths.collect(Collectors.toList());
for (Path path : pathList) {
//Processing code here
}
}
catch (filesystemexception a) {System.err.format("filesystemexception: %s%n",a);System.out.println(a.getStackTrace());}
catch (UncheckedioException b) {System.err.format("UncheckedioException: %s%n",b);System.out.println(b.getCause().getLocalizedMessage());}
catch (IOException c) { System.err.format("IOException: %s%n",c);System.out.println(c.getStackTrace());}
现在,如果 Files.walk 方法在尝试遍历文件夹时遇到某种错误,它会抛出异常,然后当然会在捕获异常后继续执行代码。
我想让它做的是忽略它遇到的任何问题,并继续遍历它可以访问的任何文件夹而不会停止。
这可能吗?
解决方法
您可以使用 Files#walkFileTree()
方法并实现您自己的将忽略异常的访问者对象:
public class Test
{
public static void main(String[] args) throws Exception
{
Path rootPath = Path.of("e:\\\\walkMe");
Files.walkFileTree(rootPath,new MyVisitor());
}
}
class MyVisitor implements FileVisitor<Path> {
@Override
public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs) {
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file,BasicFileAttributes attrs) {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file,IOException exc) {
System.out.println("error on: " + file + " " + exc.getClass());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir,IOException exc) {
return FileVisitResult.CONTINUE;
}
}
输出:
e:\\walkMe
e:\\walkMe\\ab
e:\\walkMe\\ab\\ab.txt
error on: e:\\walkMe\\cd class java.nio.file.AccessDeniedException
e:\\walkMe\\ef
e:\\walkMe\\ef\\ef.txt
此处应用程序无法浏览文件夹 cd
,但它继续浏览文件夹和文件的其余部分。
我们仍然可以像这样使用 Files#walk
:
Path rootPath = Path.of("e:\\\\walkMe");
Iterator<Path> itr = Files.walk(rootPath).iterator();
while(true) {
try {
if(itr.hasNext()) {
System.out.println(itr.next());
} else {
break;
}
}catch(Exception e) {
System.out.println(e.getLocalizedMessage());
}
}
输出:
e:\\walkMe
e:\\walkMe\\ab
e:\\walkMe\\ab\\ab.txt
java.nio.file.AccessDeniedException: e:\\walkMe\\cd
e:\\walkMe\\ef
e:\\walkMe\\ef\\ef.txt
android.support.v7.widget.GridLayout上的java.lang.StackOverflowError $Axis $1.walk(GridLayout.java:131
只有当应用程序运行某些设备时,我才会收到StackOverflowError错误,它可以与其他设备一起使用.
这是堆栈跟踪:
java.lang.StackOverflowError
at android.support.v7.widget.GridLayout$Axis$1.walk(GridLayout.java:1315)
...
...
at android.support.v7.widget.GridLayout$Axis$1.walk(GridLayout.java:1315)
at android.support.v7.widget.GridLayout$Axis$1.sort(GridLayout.java:1333)
at android.support.v7.widget.GridLayout$Axis.topologicalSort(GridLayout.java:1304)
at android.support.v7.widget.GridLayout$Axis.topologicalSort(GridLayout.java:1342)
at android.support.v7.widget.GridLayout$Axis.createArcs(GridLayout.java:1376)
at android.support.v7.widget.GridLayout$Axis.getArcs(GridLayout.java:1390)
at android.support.v7.widget.GridLayout$Axis.computeLocations(GridLayout.java:1575)
at android.support.v7.widget.GridLayout$Axis.getLocations(GridLayout.java:1596)
at android.support.v7.widget.GridLayout$Axis.getMeasure(GridLayout.java:1617)
at android.support.v7.widget.GridLayout$Axis.getMeasure(GridLayout.java:1625)
at android.support.v7.widget.GridLayout.onMeasure(GridLayout.java:939)
at android.view.View.measure(View.java:12911)
at android.widget.horizontalscrollview.measureChildWithMargins(horizontalscrollview.java:1159)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
at android.widget.horizontalscrollview.onMeasure(horizontalscrollview.java:303)
at android.view.View.measure(View.java:12911)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1163)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
at android.widget.ScrollView.onMeasure(ScrollView.java:312)
at android.view.View.measure(View.java:12911)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4805)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1399)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:676)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:557)
at android.view.View.measure(View.java:12911)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4805)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
at android.view.View.measure(View.java:12911)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:828)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:557)
at android.view.View.measure(View.java:12911)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4805)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:297)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2097)
at android.view.View.measure(View.java:12911)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4448)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
at dalvik.system.NativeStart.main(Native Method)
请提示一下吗?
解决方法:
只是调试了类似的情况,结果发现用于设置支持的二维数组 – GridLayout对于我测试的所有2.3.x设备来说太大了.删除了最大行数并避免了StackOverflowError.希望这些信息有助于您的案例!
Decoding VOX Files in C# (Converting VOX Files to WAV Files)
I wrote a C# class to decode VOX files into WAV files. It follows the Dialogic ADPCM specificationstrictly. If you read through that specification, the code below will become a lot clearer, otherwise you might think you’re reading another language altogether. The specification is really quite simple and nice once you boil it down. Note that the Dialogic ADPCM specification is different from the way NMS Communications libraries create VOX files as their file format is slightly different, and for files such as those, the code below will not work without some tweaks.
My implementation to decode from VOX to WAV files is as follows:
using System;
using System.IO;
class VOXDecoder
{
static float signal = 0;
static int previousStepSizeIndex = 0;
static bool computedNextStepSizeOnce = false;
static int[] possibleStepSizes = new int[49] { 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 };
public static void Decode(string inputFile, out string outputFile)
{
outputFile = String.Format("{0}\\{1}.wav", Path.GetDirectoryName(inputFile), Path.GetFileNameWithoutExtension(inputFile));
using (FileStream inputStream = File.Open(inputFile, FileMode.Open))
using (BinaryReader reader = new BinaryReader(inputStream))
using (FileStream outputStream = File.Create(outputFile))
using (BinaryWriter writer = new BinaryWriter(outputStream))
{
// Note that 32-bit integer values always take up 4 bytes.
// Note that 16-bit integer values (shorts) always take up 2 bytes.
// Note that HEX values resolve as 32-bit integers unless casted as something else, such as short values.
// ChunkID: "RIFF"
writer.Write(0x46464952);
// ChunkSize: The size of the entire file in bytes minus 8 bytes for the two fields not included in this count: ChunkID and ChunkSize.
writer.Write((int)(reader.BaseStream.Length * 4) + 36);
// Format: "WAVE"
writer.Write(0x45564157);
// Subchunk1ID: "fmt " (with the space).
writer.Write(0x20746D66);
// Subchunk1Size: 16 for PCM.
writer.Write(16);
// AudioFormat: 1 for PCM.
writer.Write((short)1);
// NumChannels: 1 for Mono. 2 for Stereo.
writer.Write((short)1);
// SampleRate: 8000 is usually the default for VOX.
writer.Write(8000);
// ByteRate: SampleRate * NumChannels * BitsPerSample / 8.
writer.Write(12000);
// BlockAlign: NumChannels * BitsPerSample / 8. I rounded this up to 2. It sounds best this way.
writer.Write((short)2);
// BitsPerSample: I will set this as 12 (12 bits per raw output sample as per the VOX specification).
writer.Write((short)12);
// Subchunk2ID: "data"
writer.Write(0x61746164);
// Subchunk2Size: NumSamples * NumChannels * BitsPerSample / 8. You can also think of this as the size of the read of the subchunk following this number.
writer.Write((int)(reader.BaseStream.Length * 4));
// Write the data stream to the file in linear audio.
while (reader.BaseStream.Position != reader.BaseStream.Length)
{
byte b = reader.ReadByte();
float firstDifference = GetDifference((byte)(b / 16));
signal += firstDifference;
writer.Write(TruncateSignalIfNeeded());
float secondDifference = GetDifference((byte)(b % 16));
signal += secondDifference;
writer.Write(TruncateSignalIfNeeded());
}
}
}
static short TruncateSignalIfNeeded()
{
// Keep signal truncated to 12 bits since, as per the VOX spec, each 4 bit input has 12 output bits.
// Note that 12 bits is 0b111111111111. That''s 0xFFF in HEX. That''s also 4095 in decimal.
// The sound wave is a signed signal, so factoring in 1 unused bit for the sign, that''s 4095/2 rounded down to 2047.
if (signal > 2047)
{
signal = 2047;
}
if (signal < -2047)
{
signal = -2047;
}
return (short)signal;
}
static float GetDifference(byte nibble)
{
int stepSize = GetNextStepSize(nibble);
float difference = ((stepSize * GetBit(nibble, 2)) + ((stepSize / 2) * GetBit(nibble, 1)) + (stepSize / 4 * GetBit(nibble, 0)) + (stepSize / 8));
if (GetBit(nibble, 3) == 1)
{
difference = -difference;
}
return difference;
}
static byte GetBit(byte b, int zeroBasedBitNumber)
{
// Shift the bits to the right by the number of the bit you want to get and then logic AND it with 1 to clear bits trailing to the left of your desired bit.
return (byte)((b >> zeroBasedBitNumber) & 1);
}
static int GetNextStepSize(byte nibble)
{
if (!computedNextStepSizeOnce)
{
computedNextStepSizeOnce = true;
return possibleStepSizes[0];
}
else
{
int magnitude = GetMagnitude(nibble);
if (previousStepSizeIndex + magnitude > 48)
{
previousStepSizeIndex = previousStepSizeIndex + magnitude;
return possibleStepSizes[48];
}
else if (previousStepSizeIndex + magnitude > 0)
{
previousStepSizeIndex = previousStepSizeIndex + magnitude;
return possibleStepSizes[previousStepSizeIndex];
}
else
{
return possibleStepSizes[0];
}
}
}
static int GetMagnitude(byte nibble)
{
if (nibble == 15 || nibble == 7)
return 8;
else if (nibble == 14 || nibble == 6)
return 6;
else if (nibble == 13 || nibble == 5)
return 4;
else if (nibble == 12 || nibble == 4)
return 2;
else
return -1;
}
}
It is easily called through the following two lines:
string outputWAVFilePath;
VOXDecoder.Decode(pathToYourVOXFile, out outputWAVFilePath);
Give it a shot with this sample Dialogic ADPCM VOX audio fil
Files.copy 和 Files.write 的不同似乎两种方法都做同样的事情,两种方法都将 Multipart 文件保存到特定位置
如何解决Files.copy 和 Files.write 的不同似乎两种方法都做同样的事情,两种方法都将 Multipart 文件保存到特定位置
我正在做一个项目,我试图将一个多部分文件保存到我的本地磁盘,我尝试了 Files.write 和 Files.copy,这两种方法都完成了我的工作,有人能解释一下这两者之间有什么不同吗?根据 Oracle docs copy method 将所有字节从输入流复制到文件。和 write 方法将字节写入文件。有人能给出明确的定义吗?谢谢。
Javadoc for Files class
解决方法
您不能简单地将代码中的 copy
替换为 write
,对吗?它们不可互换,因为它们采用不同的参数。 Files.copy
从 InputStream
读取并将结果写入文件。 Files.write
将字节数组或字符序列列表的内容写入文件。所以两者做了类似的事情,但它们从不同类型的输入中工作。虽然 InputStream
可以从内存缓冲区中提取,但我认为 write
总是写入已经在内存中的内容,其中 copy
通常从某些外部源(另一个文件或来自网络的东西),然后将它们写入文件。
如您所说,Files.copy()
将 InputStream
或 Path
作为写入字节的源,而 Files.write()
期望将字节写入数组字节。
有点尴尬的是,copy()
的第一个参数是源,第二个参数是目标,而 write()
则相反。
基本上,您可以说 Files.copy( Path source,Path target )
实现为
public static long copy( Path source,Path target )
{
var bytes = Files.readAllBytes( source );
Files.write( target,bytes );
return bytes.size;
}
或
public static long copy( Path source,Path target )
{
var bytes = Files.readAllBytes( source );
Files.copy( new ByteInputStream( bytes ),target );
return bytes.size;
}
(为简洁起见省略了错误处理!实际实现也可能有所不同!)
从结果来看,两种实现是等价的,但第二种需要额外的 InputStream
作为字节数组的包装器……
一般来说,如果输入数据(尚未)完全保存在内存中,您可以说您使用 Files.copy()
,否则使用 Files.write()
。使用 ByteInputStream
之类的类,您可以将数据隐藏在内存中。
Files.walkFileTree 与 Files.walk 在 Windows NTFS 上的性能
如何解决Files.walkFileTree 与 Files.walk 在 Windows NTFS 上的性能?
My application 需要定期扫描文件系统以处理文件。最初我使用 java.nio.file.Files.walk
执行扫描,但很快我遇到了一些 AccessDeniedException
的问题。 Found out 经过一些谷歌搜索后,Files.walk
期望用户可以访问探索的目录树,否则它会崩溃并停止,这使我的应用程序无法使用此功能(它由许多人自托管)各种系统上的人)。
我将实现更改为使用 java.nio.file.Files.walkfiletree
,这似乎效果很好并且处理了用户代码中的 AccessDeniedException
。
但是,最近有人报告说,扫描时间从仅 12 秒(使用 Files.walk
)飙升至 80 分钟(使用 Files.walkfiletree
) !用户拥有大约 10,000 个文件夹和 120,000 个文件。它运行的是 Windows,并且磁盘使用的是 NTFS。其他拥有类似文件夹/文件数量但运行 Linux 的用户体验不到 10 秒的扫描时间,无论使用何种方法。
我试图了解在带有 NTFS 的 Windows 上使用 Files.walkfiletree
会导致大量性能下降的原因,但鉴于我无法访问运行 Windows 的测试系统,我无法调试代码以了解时间花在哪里。
您是否知道在 Windows NTFS 下遍历文件树是否存在已知问题?如果我可以使用其他一些方法来执行该任务?请记住,我需要在用户代码中处理 AccessDeniedException
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
今天关于Java Files.walk 遇到异常错误后能否继续执行和java errorfile的讲解已经结束,谢谢您的阅读,如果想了解更多关于android.support.v7.widget.GridLayout上的java.lang.StackOverflowError $Axis $1.walk(GridLayout.java:131、Decoding VOX Files in C# (Converting VOX Files to WAV Files)、Files.copy 和 Files.write 的不同似乎两种方法都做同样的事情,两种方法都将 Multipart 文件保存到特定位置、Files.walkFileTree 与 Files.walk 在 Windows NTFS 上的性能的相关知识,请在本站搜索。
本文标签: