无法分配try-with-resources语句的资源FileWriter



我需要使用"尝试使用资源";技巧但是当我使用";尝试资源";,我无法在其他文件中重新创建FileWriter和BufferWriter。我正试图解决一些声纳问题;尝试使用资源";是一条需要遵循的规则。

有人有解决这个问题的想法吗?

感谢


try (InputStream fis=new FileInputStream(sArquivo);
BufferedReader br=new BufferedReader(new InputStreamReader(fis)); 
FileWriter fw = new FileWriter(sNomeArquivoDestino);
BufferedWriter bw = new BufferedWriter(fw)) {                
String vLinha = "";
while (br.ready())
{
vLinha = br.readLine();
if(vLinha == null) { break; }                              
bw.write(vLinha+System.lineSeparator());                 
if (lLinhas % lLimiteLinhas == 0L && lLinhas > 0L)
{                   
bw.flush();
bw.close();                     
++lPart;
sNomeArquivoDestino = sPathDestino+"\"+sFileName.replace(".TXT", "")+"-Part-"+ String.format("%05d" ,lPart)+".TXT";
fw = new FileWriter(sNomeArquivoDestino);    // Compile error: The resource fw of a try-with-resources statement cannot be assigned         
bw = new BufferedWriter(fw);    // Compile error: The resource bw of a try-with-resources statement cannot be assigned         
}                                  
++lLinhas; 
}             
}
catch (Exception ex)
{           
throw ex;
}

由于BufferedWriter用于写入多个编号的部分文件,因此没有自动关闭的文件来尝试使用resources语法。

最简单的是有一个finally块,然后自己做所有的事情。当然,也可以引入第二个嵌套循环,其中包含用于零件输出的try-with-resources。

首先,我会使用Files、Path和Paths来缩短嵌套文件构造函数的使用时间。此外,计算机的文本编码也是默认的。最好明确一点。(如果可能的话,最好是StandardCharsets.UTF_8,以获得完整的Unicode功能。(

使用ready()是错误的,因为这是一个测试,读取是否会阻塞(当前缓冲区为空(。在这里,正确的做法是请求阅读。否则,您可能太快了,仍然什么都没有,尽管磁盘上还有一些东西,但您停止了阅读。

可以使用sNomeArquivoDestino = String.format("...%s ...", ..., ...);来获得更好的样式。

Charset charset = Charset.defaultCharset();
Path arguivo = Paths.get(sArguivo);
BufferedWriter bw = null;
try (BufferedReader br = Files.newBufferedReader(arguivo, charset)) {
long lPart = 0;
long lLinhas = 0L;
for (;;) {
String vLinha = br.readLine();
if (vLinha == null) {
break;
}
if (lLinhas % lLimiteLinhas == 0L) {
if (bw != null) {
bw.close();
bw = null;
}
sNomeArquivoDestino = sPathDestino + "\"
+ sFileName.replace(".TXT", "") + "-Part-"
+ String.format("%05d", lPart) + ".TXT";
Path arquivoDestino = Paths.get(sNomeArquivoDestino);
bw = Files.newBufferedWriter(arquivoDestino, charset);
++lPart;
}
bw.write(vLinha);
bw.write(System.lineSeparator());
++lLinhas;
}
} finally {
if (bw != null) {
bw.close();
}
}

顺便说一句,前缀为sl的匈牙利语表示法在java中并不常见,更倾向于使用更流畅的名称。(将旧的MS C++与Linux C++进行比较。(

您需要更改逻辑,以便在try-with-resources中使用try-with-resources。在伪代码中:

try (fis; br):
for each partition in br:
try (fw; bw):
write partition to bw

假设你应该总是写至少一个分区,这可以做一点改变:

try (fis; br):
while (true):
try (fw; bw):
write partition
- continue when the partition is full
- break when no more data

最新更新