所以,我的“大”问题在于如何“读取”回数据,写入数据实际上相对容易。
下面做一个“基本”的工作,使用一对StringJoiners 生成一个String,可以将其写入文件和一个有点复杂的解压缩过程。
这里的问题是,限制因素(至少对我而言)是您需要阅读文件的全部内容才能开始重建它。
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.StringJoiner;
import java.util.zip.DataFormatException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Test {
public static void main(String[] args) throws IOException, DataFormatException {
File targetFile = new File("Test.dat");
int[][] data = new int[][]{
{0, 1, 2, 3, 4, 5},
{6, 7, 8, 9, 10, 11}
};
StringJoiner outterJoiner = new StringJoiner("\n");
for (int[] outter : data) {
StringJoiner innerJoiner = new StringJoiner(",");
for (int value : outter) {
innerJoiner.add(Integer.toString(value));
}
outterJoiner.add(innerJoiner.toString());
}
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(targetFile))) {
ZipEntry zipEntry = new ZipEntry("master");
zos.putNextEntry(zipEntry);
zos.write(outterJoiner.toString().getBytes());
} catch (IOException ex) {
ex.printStackTrace();
}
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(targetFile)); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ZipEntry zipEntry = zis.getNextEntry();
if (zipEntry != null) {
byte[] buffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = zis.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
String contents = new String(baos.toByteArray());
System.out.println(contents);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
我想知道,您是否不依赖 \n 作为分隔符,而是使用 ZipEntry,这将允许您一次处理每个单独的“行”数据...
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.StringJoiner;
import java.util.zip.DataFormatException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class Test {
public static void main(String[] args) throws IOException, DataFormatException {
File targetFile = new File("Test.dat");
int[][] data = new int[][]{
{0, 1, 2, 3, 4, 5},
{6, 7, 8, 9, 10, 11}
};
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(targetFile))) {
for (int index = 0; index < data.length; index++) {
int[] values = data[index];
ZipEntry zipEntry = new ZipEntry("Values-" + index);
zos.putNextEntry(zipEntry);
StringJoiner joiner = new StringJoiner(",");
for (int value : values) {
joiner.add(Integer.toString(value));
}
zos.write(joiner.toString().getBytes());
}
} catch (IOException ex) {
ex.printStackTrace();
}
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(targetFile))) {
ZipEntry zipEntry = null;
while ((zipEntry = zis.getNextEntry()) != null) {
System.out.println(zipEntry.getName());
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = zis.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
String contents = new String(baos.toByteArray());
System.out.println(contents);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
打印出来的...
Values-0
0,1,2,3,4,5
Values-1
6,7,8,9,10,11
现在,很明显,您可能不知道需要多少行,作为第一个示例,一个简单的String#split 会告诉您。 (你可以预先阅读每个条目,但那是双重浸入)
是否可以让 ZipOutputStream 将“内容”保存到压缩文件“C:/Users/Username/Documents/Compressed folder.zip”中名为“Compressed file.txt”的压缩“.txt”文件中?
这完全取决于您,如果您不担心再次读取/解析文件,那么该过程可以大大减少(工作量和复杂性)。
因此,下面的示例将一次写入一行内容,因此您只需创建一行文本,然后将其写入ZipEntry。 StringJoiner 让这个过程变得非常简单
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.StringJoiner;
import java.util.zip.DataFormatException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Test {
public static void main(String[] args) throws IOException, DataFormatException {
File targetFile = new File("Compressed.zip");
int[][] data = new int[][]{
{0, 1, 2, 3, 4, 5},
{6, 7, 8, 9, 10, 11}
};
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(targetFile))) {
ZipEntry zipEntry = new ZipEntry("Compressed.txt");
zos.putNextEntry(zipEntry);
for (int[] outter : data) {
StringJoiner joiner = new StringJoiner(",", "", "\n");
for (int value : outter) {
joiner.add(Integer.toString(value));
}
zos.write(joiner.toString().getBytes());
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}