【问题标题】:Cannot close my DataInputStream and DataOutputStream in java [duplicate]无法在 java 中关闭我的 DataInputStream 和 DataOutputStream [重复]
【发布时间】:2017-12-31 17:28:33
【问题描述】:

我最近开始学习 java 中的文件处理。但是,在这段代码中(在下面),我试图在所有读取和写入结束时关闭文件,但这样做会遇到错误。

package trycatch;

import java.util.Scanner;
import org.omg.CORBA.DataInputStream;

import java.*;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;

public class Source {

public static void main(String[] args) throws Exception {

    Scanner input = new Scanner(System.in);
    try {
    File f = new File("record.txt");

    FileOutputStream writing = new FileOutputStream(f);
    DataOutputStream write = new DataOutputStream(writing);
    write.writeUTF("What are the things that you want to do");

    String str;

    FileInputStream reading = new FileInputStream(f);
    java.io.DataInputStream read = new java.io.DataInputStream(reading);
    str = read.readUTF();
    System.out.println(str);
    }
    catch(FileNotFoundException e) {

        System.out.println("The system collapsed");
    }
    finally {
        write.close(); // write cannot be resolved
        read.close();  // read cannot be resolved
    }

    input.close();
}
}

我正在尝试 finally 关键字,但你能告诉我为什么我的 IDE 无法识别 readwrite 在那里写它吗?

写入无法解析

【问题讨论】:

  • 尽管问题被关闭为重复。您介意接受最有帮助的答案吗?

标签: java file-io file-handling


【解决方案1】:

您在 try 块内声明 write。它无法在 finally 块内解析,因为这是一个不同的范围。

你需要在 try-block 之前声明 write 以使其在 finally 中可以访问:

DataOutputStream write = null;
try {
...
    write = new DataOutputStream(writing);
...
} finally {
    if (write != null) {
        write.close();
    }
}

对于最新版本的 Java,您可以/应该使用 try-with-resource 构造来确保正确的资源处理。这样你就可以省略 finally 块,JVM 会在 try 块离开时关闭你的资源:

try (DataOutputStream write = new DataOutputStream(writing)) {
    ...
}

【讨论】:

    【解决方案2】:

    这样试试:

    package trycatch;
    
    import java.util.Scanner;
    import org.omg.CORBA.DataInputStream;
    
    import java.*;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.Writer;
    
    public class Source {
    
    public static void main(String[] args) throws Exception {
    
        Scanner input = new Scanner(System.in);
        DataOutputStream write = null;
        java.io.DataInputStream read = null;
        try {
        File f = new File("record.txt");
    
        FileOutputStream writing = new FileOutputStream(f);
        write = new DataOutputStream(writing);
        write.writeUTF("What are the things that you want to do");
    
        String str;
    
        FileInputStream reading = new FileInputStream(f);
        read = new java.io.DataInputStream(reading);
        str = read.readUTF();
        System.out.println(str);
        }
        catch(FileNotFoundException e) {
    
            System.out.println("The system collapsed");
        }
        finally {
            if (write != null)
              write.close(); // write cannot be resolved
            if (read != null)
              read.close();  // read cannot be resolved
        }
    
        input.close();
    }
    }
    

    【讨论】:

      【解决方案3】:

      write 和 read 是在 try 块中创建的,它们的作用域只在块中。将声明移动到您声明 input 的位置,它应该可以工作。

      【讨论】:

        【解决方案4】:

        你的读写字段是本地的try块,最后无法访问。在try之外初始化它。

        【讨论】:

          猜你喜欢
          • 2013-09-03
          • 2018-03-09
          • 2013-03-12
          • 2018-03-07
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 2012-04-06
          相关资源
          最近更新 更多