yangys
2025-08-04 96481362fed4eab7b96cc9016ece1917b43bbcc5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package org.springblade.mdm.utils;
 
import org.apache.tika.Tika;
import org.mozilla.universalchardet.UniversalDetector;
import org.springblade.core.tool.utils.Charsets;
 
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
 
public class FileContentUtil {
 
    /**
     * 判断是否文本类型
     * @param inputStream
     * @return
     */
    public static boolean isTextFile(InputStream inputStream) {
        Tika tika = new Tika();
        try {
            String mimeType = tika.detect(inputStream);
            //String mimeType = tika.detect(file);
            return mimeType.startsWith("text/")
                || mimeType.equals("application/xml")
                || mimeType.equals("application/json");
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
 
    /**
     * 在文本的输入流中插入一行文字
     * @param ins 输入流
     * @param lineIndexToInsert 插入的位置0based
     * @param textToInsert 插入的文本
     * @return 插入文本后的输入流
     * @throws IOException 异常
     */
    public static InputStream insertLine(InputStream ins, int lineIndexToInsert,String textToInsert) throws IOException {
        byte[] bytes = ins.readAllBytes();
        ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
        Charset charset = Charsets.charset(detectFromInputStream(byteStream));
 
        byteStream.reset();//重置,使继续可用
        return insertLine(byteStream, lineIndexToInsert,textToInsert, charset);
    }
    public static InputStream insertLine(InputStream ins, int lineIndexToInsert,String textToInsert,Charset charset) throws IOException {
        List<String> lines = new ArrayList<>();
        try (
            InputStreamReader r = new InputStreamReader(ins,charset);//, charset
            BufferedReader reader = new BufferedReader(r);) {
 
            String line;
            while ((line = reader.readLine()) != null) {
                lines.add(line);
            }
        }
        System.out.println("line="+lines);
        // 插入新行
        if (lines.size() < lineIndexToInsert) {
            lines.add(textToInsert);
        } else {
            lines.add(lineIndexToInsert, textToInsert);
        }
 
        return convert(lines,charset);
    }
 
    public static InputStream convert(List<String> lines,Charset charset) {
        // 使用系统行分隔符连接所有行
        String content = String.join(System.lineSeparator(), lines);
        // 转换为UTF-8字节流
        return new ByteArrayInputStream(content.getBytes(charset));
    }
 
    public static String detect(byte[] content) {
        UniversalDetector detector = new UniversalDetector(null);
        //开始给一部分数据,让学习一下啊,官方建议是1000个byte左右(当然这1000个byte你得包含中文之类的)
        detector.handleData(content, 0, content.length);
        //识别结束必须调用这个方法
        detector.dataEnd();
        //神奇的时刻就在这个方法了,返回字符集编码。
        return detector.getDetectedCharset();
    }
 
    public static String detectFromInputStream(InputStream inputStream) {
        UniversalDetector detector = new UniversalDetector(null);
        //开始给一部分数据,让学习一下啊,官方建议是1000个byte左右(当然这1000个byte你得包含中文之类的)
        byte[] buffer = new byte[1024];
        try {
            int actRead = inputStream.read(buffer);
 
            detector.handleData(buffer, 0, actRead);
 
            //识别结束必须调用这个方法
            detector.dataEnd();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //神奇的时刻就在这个方法了,返回字符集编码。
        return detector.getDetectedCharset();
    }
 
}