那些有什么区别?我只是学习Java ATM,但似乎我可以通过两种方式写入文件,即(我没有在这里复制try-catch块.)
FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();
Run Code Online (Sandbox Code Playgroud)
和
FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();
Run Code Online (Sandbox Code Playgroud)
我理解首先缓冲数据的概念,这是否意味着第一个示例逐个写入字符,第二个示例首先将其缓冲到内存并写入一次?
根据java api,InputStream.read()描述为:
如果由于到达流末尾而没有可用字节,则返回值-1.此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常.
我有一个while(true)循环执行读取,当通过流发送任何内容时,我总是得到-1.这是预期的.
我的问题是什么时候会读取()阻止?因为如果它没有获得任何数据,则返回-1.我希望阻塞读取等到收到数据.如果你已经到达输入流的末尾,不应该读取()只是等待数据而不是返回-1?
或者read()只阻止是否有另一个线程访问流并且你的read()无法访问流?
这引出了我的下一个问题.我曾经有过事件监听器(由我的库提供),当数据可用时会通知我.当我收到通知时,我会调用while((aByte = read()) > -1)存储字节.当我在非常接近的时间内收到两个事件并且我的所有数据都没有被显示时,我感到很困惑.似乎只显示第二个事件数据的尾端,其余部分丢失了.
我最终改变了我的代码,以便当我得到一个事件时,我会调用if(inputStream.available() > 0) while((aByte = read()) > -1)存储字节.现在它正常工作,我的所有数据都显示出来了.
有人可以解释这种行为吗?该InputStream.available()是说要回,你可以阻止下一个调用方之前读取的字节数(流?).即使我不使用.available(),我希望第一个事件的读取只是阻止第二个事件的读取,但不会擦除或消耗过多的流数据.为什么这样做会导致我的所有数据都不显示?
我正在构建一个需要扩展的java服务器.其中一个servlet将提供存储在Amazon S3中的图像.
最近在加载时,我的虚拟机内存耗尽了,之后我添加了代码来提供图像,所以我很确定流式传输更大的servlet响应会导致我的麻烦.
我的问题是:在从数据库或其他云存储中读取时,如何编写java servlet以将大型(> 200k)响应流回浏览器,是否有任何最佳实践?
我已经考虑将文件写入本地临时驱动器,然后生成另一个线程来处理流,以便可以重用tomcat servlet线程.这似乎很重要.
任何想法将不胜感激.谢谢.
我尝试文件编写如下:
String content = "Test File Content";
Run Code Online (Sandbox Code Playgroud)
Files.write(path, content.getBytes(), StandardOpenOption.CREATE);如果file不是create,则创建文件并写入内容.但是如果文件可用,则文件内容为Test File ContentTest File Content,如果代码运行重复,则文件内容为Test File ContentTest File ContentTest File Content...
Files.write(path, content.getBytes(), StandardOpenOption.CREATE_NEW);,如果file不是create,则创建文件,而不是如下所示:
java.nio.file.FileAlreadyExistsException:/ home/gyhot/Projects/indexing/ivt_new/target/test-classes/test_file at sun.nio.fs.UnixException.translateToIOException(UnixException.java:88)at ...
如何通过java新I/O覆盖文件?
嗨,我是新手Java,我想知道在控制台中读取用户输入的最佳选择是什么,据我所知,有3种方法可以做到:
Console console = System.console();BufferedReader input = new BufferedReader(new InputStreamReader(System.in));Scanner reader = new Scanner(System.in);我应该选择哪一个?为什么那个而不是其他的?
当我知道给定的InputStream是否不是缓冲的时候,总是将InputStream包装为BufferedInputStream是否有意义?例如:
InputStream is = API.getFromSomewhere()
if(!(is instanceof BufferedInputStream))
return new BufferedInputStream(is);
return is;
Run Code Online (Sandbox Code Playgroud) 要获取txt文件的内容,我通常使用扫描仪并遍历每一行以获取内容:
Scanner sc = new Scanner(new File("file.txt"));
while(sc.hasNextLine()){
String str = sc.nextLine();
}
Run Code Online (Sandbox Code Playgroud)
java api是否提供了使用一行代码获取内容的方法,如:
String content = FileUtils.readFileToString(new File("file.txt"))
Run Code Online (Sandbox Code Playgroud) 我在目录中有大约500个文本文件,文件名中的前缀相同dailyReport_.
文件的后半部分是文件的日期.(例如dailyReport_08262011.txt,dailyReport_08232011.txt)
我想使用Java程序删除这些文件(我可以使用shell脚本并在crontab中添加一个作业,但该应用程序应该由外行使用).
我可以使用这样的东西删除一个文件
try{
File f=new File("dailyReport_08232011.txt");
f.delete();
}
catch(Exception e){
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
但是我可以删除具有特定前缀的文件(例如:dailyReport08对于第8个月)我可以通过使用在shell脚本中轻松地执行此操作rm -rf dailyReport08*.txt.
但是File f=new File("dailyReport_08*.txt");在Java中不起作用(如预期的那样).
现在有没有这样的东西可以在Java中运行而不运行在目录中搜索文件的循环?
我可以使用类似于*shell脚本中使用的一些特殊字符来实现这一点吗?
无论如何都要检查OutputStream是否关闭而不试图写入并捕获IOException?
例如,考虑以下设计方法:
public boolean isStreamClosed(OutputStream out){
if( /* stream isn't closed */){
return true;
}else{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
你有什么可以替代/* stream isn't closed */的?
Java 14@Serial在java.io包中引入了一个新的注解。它在 API 文档中的简要说明:
Indicates that an annotated field or method is part of the serialization mechanism defined by the Java Object Serialization Specification.
As far as I understand the annotation is used for the compile-time validation (similarly to @Override) to check whether the serialization mechanism methods and fields are used correctly. What I don't understand, does the annotation affect the de/serialization itself as long as it is a part of the serialization mechanism? …