问题标签 [java-io]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 我没有得到我期望在 Java 中使用 readLine() 的结果
我正在使用下面的代码片段,但是它并没有像我理解的那样工作。
通过阅读有关readLine()
它的 Javadoc 说:
读取一行文本。\n
一行被认为是由换行符 ( )、回车符 ( \r
) 或紧跟换行符的回车符中的任何一个终止的。
返回: AString
包含行的内容,不包括任何行终止字符,如果已到达流的末尾,则返回 null
抛出:
IOException
- 如果发生 I/O 错误
根据我对此的理解,readLine
除了行终止符之外,第一次没有输入任何输入时应该返回 null,例如\r
. 但是,这段代码最终会无限循环。经过调试,我发现只输入终止字符时返回的不是null,而是返回一个空字符串(“”)。这对我来说没有意义。我没有正确理解什么?
java - 在 java servlet 中流式传输大文件
我正在构建一个需要扩展的 java 服务器。其中一个 servlet 将提供存储在 Amazon S3 中的图像。
最近在负载下,我的虚拟机内存不足,这是在我添加代码来提供图像之后,所以我很确定流较大的 servlet 响应会导致我的麻烦。
我的问题是:在从数据库或其他云存储读取时,如何编写 java servlet 以将大型(> 200k)响应流式传输回浏览器是否有任何最佳实践?
我考虑将文件写入本地临时驱动器,然后生成另一个线程来处理流,以便可以重新使用 tomcat servlet 线程。这似乎会很重。
任何想法将不胜感激。谢谢。
java - Eclipse IDE 中的 java.io.Console 支持
我使用 Eclipse IDE 来开发、编译和运行我的 Java 项目。今天,我尝试使用java.io.Console
该类来管理输出,更重要的是,管理用户输入。
问题是当应用程序“通过”Eclipse 运行时System.console()
返回。null
Eclipse 在后台进程上运行程序,而不是我们熟悉的带有控制台窗口的顶级进程。
有没有办法强制 Eclipse 将程序作为顶级进程运行,或者至少创建一个 JVM 可以识别的控制台?否则,我不得不将项目打包并在 Eclipse 外部的命令行环境中运行。
java - 在 Java 文件中间写入字节的最佳方法
使用 Java 在文件中间写入字节的最佳方法是什么?
xml - 在java中解析一个动态获取路径的XML文件
我在 C:/proj/test_xml/Test.java 中有一个类测试。给定 parser.parse("test.xml"); 我需要一种方法来解析 test.xml,无论它是在当前目录、proj 还是在 C:/ 中,此外,该解决方案不应使用 java.io
谢谢
java - 使用java将透明的gif / png转换为jpeg
我想使用 Java 将 gif 图像转换为 jpeg。它适用于大多数图像,但我有一个简单的透明 gif 图像:
输入 gif 图片 http://img292.imageshack.us/img292/2103/indexedtestal7.gif
[如果图像丢失:它是一个带有透明像素的蓝色圆圈]
当我使用以下代码转换此图像时:
此代码在不引发异常的情况下工作,但会导致无效的 jpeg 图像:
[如果图像丢失:IE 无法显示 jpeg,Firefox 显示的图像颜色无效。]
我正在使用 Java 1.5。
我还尝试使用 gimp 将示例 gif 转换为 png,并将 png 作为 Java 代码的输入。结果是一样的。
这是JDK中的错误吗?如何在没有 3rd 方库的情况下正确转换图像?
更新:
答案表明 jpeg 转换无法正确处理透明度(我仍然认为这是一个错误),并建议使用预定义颜色替换透明像素的解决方法。两种建议的方法都非常复杂,所以我实现了一个更简单的方法(将作为答案发布)。我接受使用此解决方法的第一个已发布答案(由 Markus 提供)。我不知道哪种实现更好。我选择了最简单的一个,但我发现了一个不起作用的 gif。
java - Java InputStream 阻塞读取
根据java api,InputStream.read()
描述为:
如果由于到达流的末尾而没有可用的字节,则返回值 -1。此方法会一直阻塞,直到输入数据可用、检测到流结束或引发异常。
我有一个while(true)
循环进行读取,当没有任何内容通过流发送时,我总是得到-1。这是预期的。
我的问题是 read() 什么时候会阻塞?因为如果它没有得到任何数据,它会返回-1。我希望阻塞读取要等到收到数据。如果您已经到达输入流的末尾,那么 read() 不应该只是等待数据而不是返回 -1 吗?
或者 read() 只有在有另一个线程访问流并且您的 read() 无法访问流时才会阻塞?
这引出了我的下一个问题。我曾经有事件监听器(由我的库提供),它会在数据可用时通知我。当我收到通知时,我会调用while((aByte = read()) > -1)
存储字节。当我在非常接近的时间内获得两个事件并且并未显示我的所有数据时,我感到很困惑。似乎只显示了第二个事件数据的尾部,其余的都丢失了。
我最终更改了我的代码,以便当我收到一个事件时,我调用if(inputStream.available() > 0) while((aByte = read()) > -1)
了存储字节。现在它工作正常,我的所有数据都显示出来了。
有人可以解释这种行为吗?据说InputStream.available()
返回在阻塞下一个调用者(流的?)之前可以读取的字节数。即使我不使用 .available() 我希望读取第一个事件只会阻止读取第二个事件,但不会擦除或消耗太多流数据。为什么这样做会导致无法显示我的所有数据?
java - 在“桶”中组织文件
我的问题是这样的:
我编写了一个客户端 HTTP 缓存,我需要以某种方式将 HTTP 有效负载存储在文件系统中。我不想用不必要的文件弄乱文件系统。
我写了这个类:
问题是有时文件没有移动到正确的文件夹,我可能会泄漏文件描述符。
您对如何改善这一点有什么建议吗?
这可能有标准解决方案吗?不分语言?
这也很慢,欢迎提高速度。
java - 在 Java 中关闭嵌套流和编写器的正确方法
注意:这个问题及其大部分答案都可以追溯到 Java 7 发布之前。Java 7 提供了自动资源管理功能,可以轻松地做到这一点。如果您使用的是 Java 7 或更高版本,您应该提前了解 Ross Johnson 的答案。
什么被认为是在 Java 中关闭嵌套流的最佳、最全面的方法?例如,考虑设置:
我知道关闭操作需要被保险(可能通过使用 finally 子句)。我想知道的是,是否有必要明确确保嵌套流已关闭,或者仅确保关闭外部流(oos)就足够了?
我注意到的一件事,至少在处理这个特定示例时,内部流似乎只抛出 FileNotFoundExceptions。这似乎意味着从技术上讲,如果它们失败,则无需担心关闭它们。
这是同事写的:
从技术上讲,如果实施得当,关闭最外层流 (oos) 就足够了。但实施似乎有缺陷。
示例:BufferedOutputStream 继承自 FilterOutputStream 的 close(),它定义为:
但是,如果 flush() 出于某种原因抛出运行时异常,则永远不会调用 out.close()。因此,主要担心关闭 FOS 似乎是“最安全的”(但丑陋),这会使文件保持打开状态。
什么被认为是关闭嵌套流的最佳方法?
是否有任何官方的 Java/Sun 文档可以详细处理这个问题?
java - Java IO 输入流在读取外部 C 程序的标准输出和标准错误时阻塞
几天前我在这里发布了同样的问题(Java 使用 inputstream 从外部程序读取标准输出),我发现了一些很好的建议来处理读取时的块(while(is.read()) != -1)),但我仍然无法解决问题。
在阅读了这个类似问题的答案后,
Java InputStream 阻塞读取 (尤其是 Guss 发布的答案),
我开始相信使用 is.read() != -1 条件循环输入流如果程序是交互式的(即它需要用户的多个输入并在后续输入时呈现额外的输出,并且程序仅在给出明确的退出命令时才退出)。我承认我对多线程了解不多,但我认为我需要一种机制来在需要用户输入时迅速暂停输入流线程(每个用于 stdout、stderr),并在输入后恢复提供以防止阻塞。以下是我当前的代码,它在指示的行上遇到了块:
...
public class EGMStreamGobbler implements Runnable{
private BufferedReader instream;
private EGMProcess egm;
public EGMStreamGobbler(BufferedReader isr, EGMProcess aEGM)
{
instream = isr;
egm = aEGM;
}
public void run()
{
try{
int c;
while((c = instream.read()) != 1)
{
egm.processStdOutStream((char)c);
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
我为代码的长度道歉,但我的问题是,
1) 有没有办法在不使用 read() 的情况下控制接收输入流(stdout、stderr)的过程?还是我只是执行得很糟糕?
2) 多线程是开发接收输入流和编写输出过程的正确策略吗?
PS:如果有人能提供类似问题的解决方案,对我有很大帮助!