Skip to content

Commit 75a2220

Browse files
authored
Merge pull request #69 from iminright/linebreak
Linebreak
2 parents 51da96f + 4539f1b commit 75a2220

File tree

12 files changed

+398
-5
lines changed

12 files changed

+398
-5
lines changed

rdf-file-core/src/main/java/com/alipay/rdf/file/common/ProtocolFileWriter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class ProtocolFileWriter implements RdfFileWriterSpi {
3838
private Map<ProcessorTypeEnum, List<RdfFileProcessorSpi>> processors;
3939
private RdfBufferedWriter writer = null;
4040
private Summary summary;
41+
// 该writer是否已经写过数据
42+
private boolean hasWritten = false;
4143

4244
@Override
4345
public void init(FileConfig fileConfig) {
@@ -129,7 +131,11 @@ public void writeLine(String line) {
129131
RdfFileUtil.assertNotNull(line, "ProtocolFileWriter.writeLine(line == null)",
130132
RdfErrorEnum.ILLEGAL_ARGUMENT);
131133
ensureOpen();
132-
writer.write(line + RdfFileUtil.getLineBreak(fileConfig));
134+
String lineWithLB = RdfFileUtil.processLineBreak(line, RdfFileUtil.getLineBreak(fileConfig)
135+
, fileConfig.isAppendLinebreakAtLast() && fileMeta.isAppendLinebreakAtLast()
136+
, !hasWritten);
137+
writer.write(lineWithLB);
138+
hasWritten = true;
133139
}
134140

135141
@Override

rdf-file-core/src/main/java/com/alipay/rdf/file/common/RawFileWriter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public class RawFileWriter implements RdfFileWriterSpi {
2424
private RdfBufferedWriter writer = null;
2525
private FileConfig fileConfig;
2626
private Map<ProcessorTypeEnum, List<RdfFileProcessorSpi>> processors;
27+
// 该writer是否已经写过数据
28+
private boolean hasWritten = false;
2729

2830
@Override
2931
public void init(FileConfig fileConfig) {
@@ -52,7 +54,12 @@ public void writeTail(Object tailBean) {
5254
@Override
5355
public void writeLine(String line) {
5456
ensureOpen();
55-
writer.write(line + RdfFileUtil.getLineBreak(fileConfig));
57+
String lineWithLB = RdfFileUtil.processLineBreak(line
58+
, RdfFileUtil.getLineBreak(fileConfig)
59+
, fileConfig.isAppendLinebreakAtLast()
60+
, !hasWritten);
61+
writer.write(lineWithLB);
62+
hasWritten = true;
5663
}
5764

5865
@Override

rdf-file-core/src/main/java/com/alipay/rdf/file/loader/TemplateLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public static FileMeta load(String templatePath, String templateEncoding) {
204204
fileMeta.setColumnSplit(templateConfig.getColumnSplit());
205205
fileMeta.setFileEncoding(templateConfig.getFileEncoding());
206206
fileMeta.setLineBreak(templateConfig.getLineBreak());
207+
fileMeta.setAppendLinebreakAtLast(Boolean.valueOf(templateConfig.getIsAppendLinebreakAtLast()));
207208
fileMeta.setRelationReadRowCompatibility(templateConfig.getRelationReadRowCompatibility());
208209
if (RdfFileUtil.isNotBlank(templateConfig.getRowCodecMode())) {
209210
fileMeta.setRowCodecMode(templateConfig.getRowCodecMode());

rdf-file-core/src/main/java/com/alipay/rdf/file/meta/FileMeta.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public class FileMeta {
5353
private Map<FileDataTypeEnum, Boolean> endWithSplit = new HashMap<FileDataTypeEnum, Boolean>();
5454
/**body是否是多模板配置*/
5555
private boolean multiBody = false;
56+
/**文件尾是否需要换行*/
57+
private boolean isAppendLinebreakAtLast = true;
5658
/**定义或者覆盖协议文件的字段类型*/
5759
private final List<FileColumnMeta> protocolDataTypes = new ArrayList<FileColumnMeta>();
5860
/**关系模式读行数据兼容模式*/
@@ -434,4 +436,12 @@ public String toString() {
434436
sb.append("]");
435437
return sb.toString();
436438
}
439+
440+
public boolean isAppendLinebreakAtLast() {
441+
return isAppendLinebreakAtLast;
442+
}
443+
444+
public void setAppendLinebreakAtLast(boolean appendLinebreakAtLast) {
445+
isAppendLinebreakAtLast = appendLinebreakAtLast;
446+
}
437447
}

rdf-file-core/src/main/java/com/alipay/rdf/file/meta/TemplateConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public class TemplateConfig {
2222
private String columnSplit = "|";
2323
/** 换行符*/
2424
private String lineBreak = "\r\n";
25+
/** 文件尾是否需要换行 */
26+
private String isAppendLinebreakAtLast = "true";
2527
/** 文件以分隔符开始 head|body|tail*/
2628
private String startWithSplit;
2729
/** 文件以分隔符结束 head|body|tail*/
@@ -153,6 +155,14 @@ public void setStatisticColumnPairs(List<String> statisticColumnPairs) {
153155
this.statisticColumnPairs = statisticColumnPairs;
154156
}
155157

158+
public String getIsAppendLinebreakAtLast() {
159+
return isAppendLinebreakAtLast;
160+
}
161+
162+
public void setIsAppendLinebreakAtLast(String isAppendLinebreakAtLast) {
163+
this.isAppendLinebreakAtLast = isAppendLinebreakAtLast;
164+
}
165+
156166
public List<String> getProtocolDataType() {
157167
return protocolDataType;
158168
}

rdf-file-core/src/main/java/com/alipay/rdf/file/model/FileConfig.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public class FileConfig implements Cloneable {
6262
private Boolean relationReadRowCompatibility;
6363
/** 写文件的时候是否在文件尾部追加*/
6464
private boolean isAppend = false;
65+
/**文件尾是否需要换行*/
66+
private boolean isAppendLinebreakAtLast = true;
6567
/** 外部构建的输入流*/
6668
private InputStream is;
6769
/** 透传给插件的参数*/
@@ -86,7 +88,6 @@ public FileConfig(String filePath, String templatePath, StorageConfig storageCon
8688

8789
/**
8890
* 构造方法
89-
*
9091
* @param templatePath
9192
* @param storageConfig
9293
*/
@@ -99,7 +100,6 @@ public FileConfig(String templatePath, StorageConfig storageConfig) {
99100

100101
/**
101102
* 读数据时, 输入流由外界构造
102-
*
103103
* @param is
104104
* @param templatePath
105105
*/
@@ -325,6 +325,14 @@ public void setCreateEmptyFile(boolean createEmptyFile) {
325325
this.createEmptyFile = createEmptyFile;
326326
}
327327

328+
public boolean isAppendLinebreakAtLast() {
329+
return isAppendLinebreakAtLast;
330+
}
331+
332+
public void setAppendLinebreakAtLast(boolean appendLinebreakAtLast) {
333+
isAppendLinebreakAtLast = appendLinebreakAtLast;
334+
}
335+
328336
public boolean isReadAll() {
329337
return isReadAll;
330338
}
@@ -376,6 +384,7 @@ public FileConfig clone() {
376384
config.setRowValidators(rowValidators);
377385
config.setInputStream(is);
378386
config.setColumnSplit(columnSplit);
387+
config.setAppendLinebreakAtLast(isAppendLinebreakAtLast);
379388
config.params = params;
380389
for(String processKey : processorKeys){
381390
config.addProcessorKey(processKey);
@@ -428,6 +437,7 @@ public String toString() {
428437
sb.append(",length=").append(length);
429438
}
430439
sb.append(",isAppend=").append(isAppend);
440+
sb.append(",isAppendLinebreakAtLast=").append(isAppendLinebreakAtLast);
431441
sb.append(",isReadAll=").append(isReadAll);
432442
if (null != relationReadRowCompatibility) {
433443
sb.append(",relationReadRowCompatibility=").append(relationReadRowCompatibility);

rdf-file-core/src/main/java/com/alipay/rdf/file/util/RdfFileUtil.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,24 @@ public static Map<String, String> parsePathParams(String path) {
823823
return params;
824824
}
825825

826+
/**
827+
* 为originalLine处理LineBreak的逻辑
828+
* @param originalLine 写入的数据的原始版本
829+
* @param linebreak 换行符
830+
* @param isAppendLBAtLast 是否要在文件末尾写入LineBreak
831+
* @param isFirstLine 当前要写入的行是否是该文件的第一行
832+
* @return
833+
*/
834+
public static String processLineBreak(String originalLine, String linebreak, boolean isAppendLBAtLast, boolean isFirstLine){
835+
if(isAppendLBAtLast){
836+
// 如果需要在文件末尾添加LB则始终将LB追加在要写入的行后
837+
return originalLine + linebreak;
838+
}else {
839+
// 否则将LB追加在要写入的行前,除了文件的第一行
840+
return isFirstLine ? originalLine : linebreak + originalLine;
841+
}
842+
}
843+
826844
/**
827845
* 从输入流读取指定长度数据到byte[]
828846
*
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Alipay.com Inc.
3+
* Copyright (c) 2004-2021 All Rights Reserved.
4+
*/
5+
package com.alipay.rdf.file;
6+
7+
import com.alipay.rdf.file.model.FileDefaultConfig;
8+
import com.alipay.rdf.file.util.TemporaryFolderUtil;
9+
import com.alipay.rdf.file.util.TestLog;
10+
import org.junit.After;
11+
import org.junit.Before;
12+
13+
import java.io.File;
14+
import java.io.FileInputStream;
15+
import java.io.IOException;
16+
17+
/**
18+
* @author wanhaofan
19+
* @version TestUtil.java, v 0.1 2021年09月26日 2:08 PM wanhaofan
20+
*/
21+
public class AbstractFileTestCase {
22+
23+
public TemporaryFolderUtil tf = new TemporaryFolderUtil();
24+
25+
@Before
26+
public void setUp() throws IOException {
27+
tf.create();
28+
new FileDefaultConfig().setCommonLog(new TestLog());
29+
}
30+
31+
public final int getLastByteOfFile(String filePath) throws IOException {
32+
FileInputStream fis = null;
33+
34+
try {
35+
fis = new FileInputStream(filePath);
36+
int prevByte = -1;
37+
int currentByte = fis.read();
38+
while(currentByte != -1){
39+
prevByte = currentByte;
40+
currentByte = fis.read();
41+
}
42+
return prevByte;
43+
} finally {
44+
if(fis != null){
45+
try {
46+
fis.close();
47+
} catch (IOException e) {
48+
e.printStackTrace();
49+
}
50+
}
51+
}
52+
}
53+
54+
public final String createLocalFile(String fileName){
55+
String filePath = tf.getRoot().getAbsolutePath();
56+
return new File(filePath, fileName).getAbsolutePath();
57+
}
58+
59+
@After
60+
public void after() {
61+
tf.delete();
62+
}
63+
64+
}

0 commit comments

Comments
 (0)