JavaPoi读取DocDocx⽂档,附:Linux和Windows下的“回车符”和“换⾏。。。Java 读取Doc/Docx ⽂档:
1. 需要添加 Apache.poi 的依赖
<!-- apache poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2. ⼯具类代码
package com.lq.file.word;
/**
* <p>Description:POIUtil ⼯具类</p>
* <p>Copyright: Copyright (c)2021</p>
* <p>author: leo</p>
* <P>@version 2.0</P>
*/
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.actor.WordExtractor;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.actor.XWPFWordExtractor;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class POIUtil {
/**
* @Description: POI 读取 word
* @update logs
* @throws Exception
*/
public static List<String>readWord(String filePath)throws Exception{
List<String> linList =new ArrayList<String>();
String buffer ="";
try{
dsWith(".doc")){
InputStream is =new FileInputStream(new File(filePath));
WordExtractor ex =new WordExtractor(is);
WordExtractor ex =new WordExtractor(is);
buffer = ex.getText();
ex.close();
if(buffer.length()>0){
//使⽤回车换⾏符分割字符串
String [] arry = buffer.split("\\r\\n");//*******⼤坑:windows下没问题,Linux/Unix下需将 \\r\\n 换成\\n
for(String string : arry){
linList.im());
}
}
}else dsWith(".docx")){
OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
POIXMLTextExtractor extractor =new XWPFWordExtractor(opcPackage);
buffer = Text();
extractor.close();
if(buffer.length()>0){
//使⽤换⾏符分割字符串
String [] arry = buffer.split("\\n");
for(String string : arry){
linList.im());
}
}
}else{
return null;
}
return linList;
}catch(Exception e){
System.out.print("error---->"+filePath);
e.printStackTrace();
return null;
}
}
}
⼤坑:
Windows下按⾏读取可正常按⾏返回字符串列表,当在Linux/Unix下时只会当成⼀⾏返回。
解决:
//使⽤回车换⾏符分割字符串
String [] arry = buffer.split("\\r\\n");//*******⼤坑:windows下没问题,Linux/Unix下需将 \\r\\n 换成\\n
扩展资料:
经常要对Linux和Windows下⽂本⽂件转换下 dos2unix
他们间的区别其实是个回车换⾏的问题
先来段历史
回车”(Carriage Return)和“换⾏”(Line Feed)这两个概念的来历和区别。
符号 ASCII码 意义
\n 10 换⾏
\r 13 回车CR
在计算机还没有出现之前,有⼀种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来⾃于此)的玩意,每秒钟可以打10个字符。但是它有⼀个问题,就是打完⼀⾏换⾏的时候,要⽤去0.2秒,正好可以打两个字符。要是在这0.2秒⾥⾯,⼜有新的字符传过来,那么这个字符将丢失。
于是,研制⼈员想了个办法解决这个问题,就是在每⾏后⾯加两个表⽰结束的字符。
⼀个叫做“回车”,告诉打字机把打印头定位在左边界;
另⼀个叫做“换⾏”,告诉打字机把纸向下移⼀⾏。
这就是“换⾏”和“回车”的来历,从它们的英语名字上也可以看出⼀⼆。
linux-and-windows-under-the-carriage-return-and-line-feed
左侧是Windows换⾏符,右侧是Linux换⾏符
后来,计算机发明了,这两个概念也就被般到了计算机上。
那时,存储器很贵,⼀些科学家认为在每⾏结尾加两个字符太浪费了,加⼀个就可以。
于是,就出现了分歧。
Windows中:
‘\r’ 回车,回到当前⾏的⾏⾸,⽽不会换到下⼀⾏,如果接着输出的话,本⾏以前的内容会被逐⼀覆盖;
‘\n’ 换⾏,换到当前位置的下⼀⾏,⽽不会回到⾏⾸;
Unix系统⾥,每⾏结尾只有“<;换⾏>”,即"\n";
Windows系统⾥,每⾏结尾是“<;回车><;换⾏>”,即“\r\n”;
Unix/Mac系统⾥,每⾏结尾是“<;回车>”,即"\r";
⼀个直接后果是,Unix/Mac系统下的⽂件在Windows⾥打开的话,所有⽂字会变成⼀⾏;
⽽Windows⾥的⽂件在Unix/Mac下打开的话,在每⾏的结尾可能会多出⼀个^M符号。
分别在Windws和Linux中查看此⽂件可知
Linux中遇到换⾏符("\n")会进⾏回车+换⾏的操作,回车符反⽽只会作为控制字符("^M")显⽰,不发⽣回
车的操作。⽽windows中要回车符+换⾏符("\r\n")才会回车+换⾏,缺少⼀个控制符或者顺序不对都不能正确的另起⼀⾏。
Windows等操作系统⽤的⽂本换⾏符和UNIX/Linux操作系统⽤的不同
Windows系统下输⼊的换⾏符在UNIX/Linux下不会显⽰为“换⾏”,⽽是显⽰为 ^M 这个符号(这是Linux等系统下规定的特殊标记,占⼀个字符⼤⼩,不是^和M的组合,打印不出来的)。
Linux下很多⽂本编辑器(命令⾏)会在显⽰这个标记之后,补上⼀个⾃⼰的换⾏符,以避免内容混乱(只是⽤于显⽰,补充的换⾏符不会写⼊⽂件,有专门的命令将Windows换⾏符替换为Linux换⾏符)。
UNIX/Linux系统下的换⾏符在Windows系统的⽂本编辑器中会被忽略,整个⽂本会乱成⼀团。
Windows换⾏是\r\n,⼗六进制数值是:0D0A。
LINUX换⾏是\n,⼗六进制数值是:0A
所以在linux保存的⽂件在Windows上⽤记事本看的话会出现⿊点,我们可以在LINUX下⽤命令把linux的⽂件格式转换成win格式的。
unix2dos 是把linux⽂件格式转换成windows⽂件格式
dos2unix 是把windows格式转换成linux⽂件格式
linux下删除windows换⾏符^M
OJ判题时发现⼀个问题:⽤%c读⼊的代码都会报wa。后来发现跟scanf有关。
在linux下使⽤%c会读到\n和\r两个字符。所以需要将^M(也就是\r)字符删掉
删除⽅法不少。了⼀个⽐较简单的。
要将a.txt⾥的^M去掉并写⼊b.txt,则使⽤如下指令
| tr -d “^M” > b.txt
注意:语句中的^M是通过ctrl+V, ctrl+M输⼊的。特指/r字符
unix 下换⾏符只有: \r
Dos 下换⾏符有:\r\n
具体的,
\r的ascii 码是:13
linux怎么读取windows文件\n的ascii 码是:10
C语⾔编程时
windows系统 \r 就是return 回到本⾏⾏⾸,这就会把这⼀⾏以前的输出覆盖掉,
例如:
int main() {
cout << “hahaha” << “\r” << “xixi” ;
}
最后只显⽰ xixi ⽽ hahaha 被覆盖了
\n 是回车+换⾏把光标先移到⾏⾸,然后换到下⼀⾏,也就是 下⼀⾏的⾏⾸拉
int main() {
cout << “hahaha” << “\n” << “xixi” ;
}
则显⽰
hahaha
xixi
在windows 系统中,当你输⼊回车时会⾃动变成\r\n
在linux下的回车键只代表\n
⽽在windows下的回车键表⽰\r\n
\n为进⼊下⼀⾏,\r为打印头回到⾏⾸上
linux/unix下,只⽤\n,它就表⽰回车+换⾏
windows下,\r只回车不换⾏的,\n是换⾏,但在有些编辑中单独的\n是不会换⾏的(如notepad)
⼀般在程序中,写\n就可以了,它在linux或windows中都能实现回车+换⾏的功能(只是在⽂本⽂件中,linux只会有0x0a,windows会⾃动换为0x0d 0x0a)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论