Files#write 不适用于 byte[] 和字符集
Files#write does not work with byte[] and charset
按照这个 3rd answer ,我可以写一个这样的文件
Files.write(Paths.get("file6.txt"), lines, utf8,
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
然而,当我在我的代码上尝试时,我得到了这个错误:
The method write(Path, Iterable, Charset,
OpenOption...) in the type Files is not applicable for the arguments
(Path, byte[], Charset, StandardOpenOption)
这是我的代码:
File dir = new File(myDirectoryPath);
File[] directoryListing = dir.listFiles();
if (directoryListing != null) {
File newScript = new File(newPath + "//newScript.pbd");
if (!newScript.exists()) {
newScript.createNewFile();
}
for (File child : directoryListing) {
if (!child.isDirectory()) {
byte[] content = null;
Charset utf8 = StandardCharsets.UTF_8;
content = readFileContent(child);
try {
Files.write(Paths.get(newPath + "\newScript.pbd"), content,utf8,
StandardOpenOption.APPEND); <== error here in this line.
} catch (Exception e) {
System.out.println("COULD NOT LOG!! " + e);
}
}
}
}
请注意,如果更改我的代码使其正常工作并写入文件(删除 utf8)。
Files.write(Paths.get(newPath + "\newScript.pbd"), content,
StandardOpenOption.APPEND);
你在第3个回答中提到了文件的内容是可迭代的,即List。您不能将此方法与 byte[] 一起使用。使您的 readFileContent() 方法 return 像 List 一样可迭代(每个元素都是文件的一行)。
说明
Files#write
方法有 3 个重载(参见 documentation):
- 需要
Path, byte[], OpenOption...
(无字符集)
- 采用
Path, Iterable<? extends CharSequence>, OpenOption...
(如 List<String>
,无字符集,使用 UTF-8)
- 需要
Path, Iterable<? extends CharSequence>, Charset, OpenOption...
(有字符集)
对于您的呼叫(Path, byte[], Charset, OpenOption...
),不存在匹配的版本。因此,它不会编译。
它不匹配第一个和第二个重载,因为它们不支持 Charset
并且它不匹配第三个重载,因为数组 Iterable
(a class 就像 ArrayList
一样),byte
也不扩展 CharSequence
(String
扩展)。
在错误消息中,您可以看到 Java 计算出的内容最接近您的调用,不幸的是(如前所述),它不适用于您的参数。
解决方案
您很可能打算进行第一次超载:
Files.write(Paths.get("file6.txt"), lines,
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
即没有字符集。
备注
字符集在您的上下文中毫无意义。字符集的唯一目的是将 String
正确转换为二进制 byte[]
。但是您的数据已经是二进制的,因此字符集在此之前就已到位。在您的情况下,这将是 readFileContent
.
中的阅读阶段
另请注意,Files
中的所有方法都已默认使用 UTF-8。所以无论如何都不需要另外指定它。
在指定OpenOption
s时,可能还想指定是StandardOpenOption.READ
还是StandardOpenOption.WRITE
模式。 Files#write
方法默认使用:
WRITE
CREATE
TRUNCATE_EXISTING
所以你可能想用
调用它
WRITE
CREATE
APPEND
例子
以下是一些如何以 UTF-8 格式完全读取和写入文本和二进制文件的片段:
// Text mode
List<String> lines = Files.readAllLines(inputPath);
// do something with lines
Files.write(outputPath, lines);
// Binary mode
byte[] content = Files.readAllBytes(inputPath);
// do something with content
Files.write(outputPath, content);
按照这个 3rd answer ,我可以写一个这样的文件
Files.write(Paths.get("file6.txt"), lines, utf8,
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
然而,当我在我的代码上尝试时,我得到了这个错误:
The method write(Path, Iterable, Charset, OpenOption...) in the type Files is not applicable for the arguments (Path, byte[], Charset, StandardOpenOption)
这是我的代码:
File dir = new File(myDirectoryPath);
File[] directoryListing = dir.listFiles();
if (directoryListing != null) {
File newScript = new File(newPath + "//newScript.pbd");
if (!newScript.exists()) {
newScript.createNewFile();
}
for (File child : directoryListing) {
if (!child.isDirectory()) {
byte[] content = null;
Charset utf8 = StandardCharsets.UTF_8;
content = readFileContent(child);
try {
Files.write(Paths.get(newPath + "\newScript.pbd"), content,utf8,
StandardOpenOption.APPEND); <== error here in this line.
} catch (Exception e) {
System.out.println("COULD NOT LOG!! " + e);
}
}
}
}
请注意,如果更改我的代码使其正常工作并写入文件(删除 utf8)。
Files.write(Paths.get(newPath + "\newScript.pbd"), content,
StandardOpenOption.APPEND);
你在第3个回答中提到了文件的内容是可迭代的,即List。您不能将此方法与 byte[] 一起使用。使您的 readFileContent() 方法 return 像 List 一样可迭代(每个元素都是文件的一行)。
说明
Files#write
方法有 3 个重载(参见 documentation):
- 需要
Path, byte[], OpenOption...
(无字符集) - 采用
Path, Iterable<? extends CharSequence>, OpenOption...
(如List<String>
,无字符集,使用 UTF-8) - 需要
Path, Iterable<? extends CharSequence>, Charset, OpenOption...
(有字符集)
对于您的呼叫(Path, byte[], Charset, OpenOption...
),不存在匹配的版本。因此,它不会编译。
它不匹配第一个和第二个重载,因为它们不支持 Charset
并且它不匹配第三个重载,因为数组 Iterable
(a class 就像 ArrayList
一样),byte
也不扩展 CharSequence
(String
扩展)。
在错误消息中,您可以看到 Java 计算出的内容最接近您的调用,不幸的是(如前所述),它不适用于您的参数。
解决方案
您很可能打算进行第一次超载:
Files.write(Paths.get("file6.txt"), lines,
StandardOpenOption.CREATE, StandardOpenOption.APPEND);
即没有字符集。
备注
字符集在您的上下文中毫无意义。字符集的唯一目的是将 String
正确转换为二进制 byte[]
。但是您的数据已经是二进制的,因此字符集在此之前就已到位。在您的情况下,这将是 readFileContent
.
另请注意,Files
中的所有方法都已默认使用 UTF-8。所以无论如何都不需要另外指定它。
在指定OpenOption
s时,可能还想指定是StandardOpenOption.READ
还是StandardOpenOption.WRITE
模式。 Files#write
方法默认使用:
WRITE
CREATE
TRUNCATE_EXISTING
所以你可能想用
调用它WRITE
CREATE
APPEND
例子
以下是一些如何以 UTF-8 格式完全读取和写入文本和二进制文件的片段:
// Text mode
List<String> lines = Files.readAllLines(inputPath);
// do something with lines
Files.write(outputPath, lines);
// Binary mode
byte[] content = Files.readAllBytes(inputPath);
// do something with content
Files.write(outputPath, content);