【问题标题】:Is there a way to create FileInputStream with mark feature?有没有办法用标记功能创建 FileInputStream?
【发布时间】:2011-07-26 15:41:25
【问题描述】:

是否有任何可能的方法来创建 FileInputStream 并将支持的功能标记为 true

【问题讨论】:

标签: java inputstream


【解决方案1】:

将其包裹在BufferedInputStream中。

而不是

FileInputStream fis = new FileInputStream(...);

这样做:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(...));

并使用bis 而不是fis;您的代码中无需更改任何其他内容。

【讨论】:

  • 在这一行中找不到俄罗斯文件名异常 new FileInputStream(...) 我应该怎么做其他所有文件工作正常但文件名不支持俄罗斯字符
  • 很有可能会出现“Resetting to invalid mark”IOException 原因。
  • 非常感谢。帮助我解决了“java.io.IOException:getFileMagic() 仅在支持 mark(int) 的流上运行”。很好的答案!
【解决方案2】:

将您的 Fileinputstream 包装在 BufferedInputStream 中。

缓冲流支持标记。

【讨论】:

  • @Sathish Marking 更像是一项功能,即使该功能存在,也取决于用户是否使用它。但是,如果您强烈希望阻止标记,那么您可以创建装饰器类并覆盖 mark() 方法以不做任何事情,而 markSupported() 则返回 false。
  • 这并不总是正确的 - 它可能会给你“重置为无效标记”它不一致。
  • 缓冲输入流的缓冲区必须足够大。
  • 另一个警告 - 如果底层(文件)流在标记重置周期内被完全读取,无论 reset() 尝试读取(post -reset) 缓冲流
【解决方案3】:

试试这样的

public FileInputStream fstream;
public DataInputStream in;
public BufferedInputStream bs;
public String path;

public void myExample() throws IOException{
    path = "yourPath";
    try {
        fstream = new FileInputStream(path);
        in = new DataInputStream(fstream);
        bs = new BufferedInputStream(new InputStreamReader(in));

        //do something

        br.close(); //when do something is completed
        } catch (FileNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "File not found");
        }
        }

【讨论】:

    【解决方案4】:

    BufferedInputStreams 并不神奇。它们将仅支持与其底层缓冲区一样大的标记,并且这些缓冲区将占用内存。因此,如果您沿着这条路线走,重要的是您了解使用案例并可能使用适当大小的缓冲区调用 BufferedInputStream 构造函数。如果底层文件开始变大并且您标记得足够远,那么这种技术可能不适合您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多