java中如何通过IO流将稀疏数组写入磁盘和从磁盘中读取,整行存,整行取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何通过IO流将稀疏数组写入磁盘和从磁盘中读取,整行存,整行取相关的知识,希望对你有一定的参考价值。
int chessArr1[][] =new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
System.out.println("------原始的二维数组------");
for(int[] row : chessArr1)
for(int data : row)
System.out.printf("%d\t",data);
System.out.println();
int sum =0;
for (int i = 0; i < 11; i++)
for (int j = 0; j < 11; j++)
sum++;
// 2. 创建对应的稀疏数组
int sparseArr[][]=new int[sum+1][3];
// 给稀疏数组赋值
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
int chessArr2[][] =new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++)
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
//输出还原后的二维数组
System.out.println();
System.out.println("*******还原后的二维数组******");
for(int[] row : chessArr2)
for(int data : row)
System.out.printf("%d\t",data);
System.out.println();
public static void writ(int sparseArr[][])
System.out.println("写入磁盘的数据中~~~~~~");
File file = new File("E:\\java\\sparseArr.txt");
BufferedWriter bw = null;
try
bw = new BufferedWriter(new FileWriter(file));
if (!file.exists())
file.createNewFile();
StringBuilder allBuilder = new StringBuilder();
for (int[] rows : sparseArr)
StringBuilder rowBuilder = new StringBuilder();
for (int item : rows)
rowBuilder.append(item + "\t");
allBuilder.append(rowBuilder + "\n");
bw.write(String.valueOf(allBuilder));
bw.flush();
bw.close();
catch (IOException e)
e.printStackTrace();
//读取磁盘
public static int[][] read()
System.out.println("读取磁盘的数据中~~~~~~");
File file = new File("E:\\java\\sparseArr.txt");
int[][] sparseArr = null;
try
BufferedReader br = new BufferedReader(new FileReader(file));
if (!file.exists())
file.createNewFile();
String row = br.readLine();
String[] s = new String(row).split("\t");
sparseArr = new int[Integer.parseInt(s[0])][Integer.parseInt(s[1])];
while ((row = br.readLine()) != null)
String[] s2 = new String(row).split("\t");
sparseArr[Integer.parseInt(s2[0])][Integer.parseInt(s2[1])] = Integer.parseInt(s2[2]);
br.close();
catch (IOException e)
e.printStackTrace();
return sparseArr;
参考技术A 老韩图解??????? 做的练习题吗??? 参考技术B IO流自定义字节流的缓冲区:
思路:BufferedInputStream类中read()方法的工作原理
1)先一个一个从字节流中读取字节,读取一定量(自定义)之后,存储在一个字节数组(缓冲区)(FileInputStream.read(byte[] b)),并获得存储数量(read方法的返回值)。
2)一个一个字节返回,返回一个,存储数量减1,然后指针往后移一位,准备取下一个。
3)如果存储数量为0 ,代表当前数组中所有数据已经全部取完,此时再来一次读取(read(byte[] b)),再获得此次存储数量。
4)如果存储数量(即read方法返回-1),代表读到文件末尾,返回-1。
因此,需要用到以下几个变量:
读取的字节数量,指向数组中准备取哪一个的指针,将要返回的字节变量。
如何将 zip 文件从字节数组写入磁盘
【中文标题】如何将 zip 文件从字节数组写入磁盘【英文标题】:How to write zip file to disk from byte array 【发布时间】:2018-11-29 22:41:23 【问题描述】:我在 Go 中从 S3 下载一个 zip 文件,如下所示:
buff := &aws.WriteAtBuffer
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil
log.Println(err)
return err
data := buff.Bytes()
我将“数据”发送到用 Python3 编写的客户端,并且需要将此字节数组转换回 zip 文件并将其放在指定的目录中。我试过这个:
file_bytes = msg_obj["Params"]
try:
zf = zipfile.ZipFile(file_bytes, "r")
for fileinfo in zf.infolist():
print(zf.read(fileinfo).decode('ascii'))
except: print("Err:", sys.exc_info()[0])
但我收到此错误:
OSError: [Errno 36] 文件名太长"
我只想“重建”压缩文件并将其保存到目录中。
【问题讨论】:
你是在windows上运行你的python脚本吗?你能提供一个导致错误的文件名示例吗? 【参考方案1】:读取the documentation,ZipFile类的第一个参数是文件名或文件对象,不是Zip内容。
如果您想在内存中读取 ZipFile 而不创建真实文件,您需要使用 io.BytesIO 包装 file_bytes。
【讨论】:
【参考方案2】:我想出了如何做到这一点。在 go 中,您需要对其进行 base64 编码(作为字符串)。
buff := &aws.WriteAtBuffer
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil
log.Println(err)
return err
data := b64.StdEncoding.EncodeToString(buff.Bytes())
然后在 python 中就这么简单('file_bytes' 是 base64 编码的字符串):
d = base64.b64decode(file_bytes)
f = open('home/update_file', 'wb')
f.write(d)
f.close()
然后 bam,你有一个重新组装的 zip 文件。
【讨论】:
以上是关于java中如何通过IO流将稀疏数组写入磁盘和从磁盘中读取,整行存,整行取的主要内容,如果未能解决你的问题,请参考以下文章
二维数组转稀疏数组,写入文件后再读取文件,将内容转回二维数组
使用java的输入,输出流将一个文本文件的内容按行读出,每读一行就顺序添加行号,并写入到另一个文件