我是Java编程的初学者,目前正在编写一个必须能够压缩和解压缩.zip文件的应用程序.我可以使用以下代码使用内置的Java zip功能以及Apache Commons IO库解压缩Java中的zipfile:
public static void decompressZipfile(String file, String outputDir) throws IOException {
if (!new File(outputDir).exists()) {
new File(outputDir).mkdirs();
}
ZipFile zipFile = new ZipFile(file);
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
File entryDestination = new File(outputDir, entry.getName());
if (entry.isDirectory()) {
entryDestination.mkdirs();
} else {
InputStream in = zipFile.getInputStream(entry);
OutputStream out = new FileOutputStream(entryDestination);
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了我以前使用的外部库之外,我将如何从目录创建zip文件?(Java标准库和Commons IO)
我试图找到一种更有效的方法来从远程 URL 读取文件并将其保存到字节数组中。这是我目前拥有的:
private byte[] fetchRemoteFile(String location) throws Exception {
URL url = new URL(location);
InputStream is = null;
byte[] bytes = null;
try {
is = url.openStream ();
bytes = IOUtils.toByteArray(is);
} catch (IOException e) {
//handle errors
}
finally {
if (is != null) is.close();
}
return bytes;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我目前将 URL 传递给该方法,该方法使用 InputStream 对象读取文件的字节。此方法使用 Apache Commons IOUtils。但是,此方法调用往往需要相对较长的时间才能运行。当一个接一个地检索数百、数千或数十万个文件时,它会变得很慢。有没有办法改进这种方法,使其运行更有效?我已经考虑过多线程,但我想把它作为最后的手段。
善良的 Attn 版主:在将此查询标记为重复之前,请注意我已检查 - Link1、Link2、Link3并且无法解决该问题。我也相信上下文和错误与那些不同,因此在这里寻求帮助。
上下文:从 NSEIndia 网站下载 csv 文件到本地文件夹(注意:可以从其他随机网站下载 CSV 文件)。
问题:返回错误 - javax.net.ssl.SSLException:连接重置(完整错误粘贴在下面)
观察:我很困惑,因为我昨天遇到了同样的问题,但经过几次重试后,它奏效了。我没有更改代码或设置。
问题:有什么我可以做的,以确保在这个特定网站上看不到这个错误?
代码:
// Using FileUtils from -> import org.apache.commons.io.FileUtils;
try {
FileUtils.copyURLToFile(new URL("https://www.nseindia.com/content/fo/fo_mktlots.csv"),new File("D:\\Download\\t1.csv"));
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
错误:
javax.net.ssl.SSLException: Connection reset
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:127)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:324)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:262)
at java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1652)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1038)
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:245)
at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:285)
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:344)
at java.base/sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:746)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:689)
at java.base/sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:717)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1610) …Run Code Online (Sandbox Code Playgroud) 我已经实现了一个 REST 服务,用于使用 IOUtils.copy() 下载一个中等大 (250 Mb) 的 zip 文件,类似于将文件写入 servletoutputstream 的最有效方法。REST 服务是使用 HttpURLConnection 从另一个应用程序调用的。我在接收端使用 IOUtils.copy() 将文件保存到磁盘。
下载一个文件需要 30 多分钟。这是这样太慢了。
想法?更好的实现?
我有一个 java 进程挂在调用中,IOUtils.toString使用以下代码:
String html = "";
try {
html = IOUtils.toString(someUrl.openStream(), "utf-8"); // process hangs on this line
} catch (Exception e) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
它无法可靠地重现这一点。它是网络爬虫的一部分,因此成功执行了该行数千次,但最终导致该进程在几天后挂起。
jstack 的输出:
2013-09-25 09:09:36
Full thread dump OpenJDK 64-Bit Server VM (20.0-b12 mixed mode):
"Attach Listener" daemon prio=10 tid=0x00007f2b1c001000 nid=0x225a waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-0" prio=10 tid=0x00007f2b34122000 nid=0x187b runnable [0x00007f2b30970000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:146)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
- locked <0x00000000e3d2d160> (a …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码和Apache Commons-IO 2.4库列出根目录及其子目录中扩展名为".xls"的文件.我正在检查的大小collection<File>,但它给出了0.我没有看到代码中哪里可能出错.你能帮帮我吗?
public static void main(String[] args) throws IOException {
File rootDir = new File(args[0]);
Collection<File> files = FileUtils.listFiles(rootDir, new RegexFileFilter("[a-zA-Z].xls"), DirectoryFileFilter.DIRECTORY);
System.out.println("collection size:" + files.size());
}
Run Code Online (Sandbox Code Playgroud) 我需要开发一个应用程序,一旦文件在预定义目录中创建,它将处理 csv 文件。预计会有大量传入文件。
我见过在生产中使用 Apache Commons IO 文件监控的应用程序。它工作得很好。我见过它一天处理多达 2100 万个文件。似乎 Apache Commons IO 文件监控会轮询目录并执行 listFiles 来处理文件。
我的问题:JDK WatchService 是否和 Apache Commons IO 文件监控一样好?有谁知道任何优点和缺点?
我正在使用如何将InputStream转换为虚拟文件的答案,该文件用于org.apache.commons.io.IOUtils将给定的内容复制InputStream到a FileOutputStream以创建File.
我应该关闭InputStream给定的?
我有一个21.6GB的文件,我想从头到尾阅读它,而不是像往常一样从开头到结尾.
如果我使用以下代码从头到尾读取文件的每一行,则需要1分12秒.
val startTime = System.currentTimeMillis()
File("very-large-file.xml").forEachLine {
val i = 0
}
val diff = System.currentTimeMillis() - startTime
println(diff.timeFormat())
Run Code Online (Sandbox Code Playgroud)
现在,我已经读过要反向读取文件然后我应该使用ReversedLinesFileReaderApache Commons.我创建了以下扩展函数来做到这一点:
fun File.forEachLineFromTheEndOfFile(action: (line: String) -> Unit) {
val reader = ReversedLinesFileReader(this, Charset.defaultCharset())
var line = reader.readLine()
while (line != null) {
action.invoke(line)
line = reader.readLine()
}
reader.close()
}
Run Code Online (Sandbox Code Playgroud)
然后以下面的方式调用它,这与前面的方式相同,只是调用forEachLineFromTheEndOfFile函数:
val startTime = System.currentTimeMillis()
File("very-large-file.xml").forEachLineFromTheEndOfFile {
val i = 0
}
val diff = System.currentTimeMillis() - startTime
println(diff.timeFormat())
Run Code Online (Sandbox Code Playgroud)
这需要17分50秒才能运行!
ReversedLinesFileReader是以正确的方式使用的吗?我在我的项目中使用 commons-io 并想要对其进行着色。我遇到了一个我似乎无法弄清楚的警告:
[WARNING] commons-io-2.7.jar, murder-1.0-SNAPSHOT.jar define 180 overlapping classes and resources:
...
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪,因为murder-1.0-SNAPSHOT.jar我正在尝试构建的 jar 应该包含 commons-io jar。
我这样定义我的 commons-io 依赖项:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
(我以为我应该使用runtime范围,但后来我无法运行package,因为它抱怨FileUtils找不到)
这是我的阴影插件的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>commons-io:commons-io</include>
</includes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/MANIFEST.MF</exclude>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
如果我完全删除<filters>,我只会收到此警告:
commons-io-2.7.jar, murder-1.0-SNAPSHOT.jar define 1 overlapping resource
[WARNING] - META-INF/MANIFEST.MF …Run Code Online (Sandbox Code Playgroud) java ×10
inputstream ×2
bytearray ×1
deadlock ×1
file ×1
fileutils ×1
http ×1
kotlin ×1
maven ×1
openjdk ×1
optimization ×1
recursion ×1
ssl ×1
sslexception ×1
subdirectory ×1
watchservice ×1
zip ×1