如何逐行比较两个文件,然后逐字比较。此外,我们需要突出显示输出[已关闭]中不匹配的单词

如何逐行比较两个文件,然后逐字比较。此外,我们需要突出显示输出中不匹配的单词。

我需要用Java编写这个并创建一个HTML文件。


哆啦的时光机
浏览 87回答 1
1回答

繁星点点滴滴

&nbsp; package base;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class DataCompareMain {&nbsp; &nbsp; public static void main(String[] args) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* List of regex given by user to ignore the comparison&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; List<String> regexList = new ArrayList<String>();&nbsp; &nbsp; &nbsp; &nbsp; regexList.add("\\d+");&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* File 1 data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; List<String> string1Lines = new ArrayList<String>();&nbsp; &nbsp; &nbsp; &nbsp; string1Lines.add("This is 555 line 1 from F1");&nbsp; &nbsp; &nbsp; &nbsp; string1Lines.add("This is common line");&nbsp; &nbsp; &nbsp; &nbsp; string1Lines.add("This is first line in left");&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* File 2 data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; List<String> string2Lines = new ArrayList<String>();&nbsp; &nbsp; &nbsp; &nbsp; string2Lines.add("This is fsd 666 line 1 from F2");&nbsp; &nbsp; &nbsp; &nbsp; string2Lines.add("This fds is common line");&nbsp; &nbsp; &nbsp; &nbsp; string2Lines.add("This is second line in right");&nbsp; &nbsp; &nbsp; &nbsp; Map<Integer, DataMismatch> mismatch = compareText(string1Lines, string2Lines, regexList);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("*********OUTPUT************");&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Below lines are mismatched");&nbsp; &nbsp; &nbsp; &nbsp; for (Entry<Integer, DataMismatch> mimatchedEntry : mismatch.entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataMismatch data = mimatchedEntry.getValue();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f1Line = data.getFile1Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f2Line = data.getFile2Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int lineNumber = (mimatchedEntry.getKey() + 1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Difference found at line number " + lineNumber + " left side text = "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "\"" + f1Line + "\" and right side text = \"" + f2Line + "\"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Entry<Integer, DataMismatch> mimatchedWords : data.getMismatchedWords().entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataMismatch wdata = mimatchedWords.getValue();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String w1 = wdata.getFile1Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String w2 = wdata.getFile2Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("At line number "+lineNumber+", Difference of words found at index " + (mimatchedWords.getKey()) + " left side word = "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "\"" + w1 + "\" and right side word = \"" + w2 + "\"");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("\n");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; String div1 = print(string1Lines, mismatch, true);&nbsp; &nbsp; &nbsp; &nbsp; String div2 = print(string2Lines, mismatch, false);&nbsp; &nbsp; &nbsp; &nbsp; String html = createHTML(div1, div2);&nbsp; &nbsp; &nbsp; &nbsp; createFile(html);&nbsp; &nbsp; }&nbsp; &nbsp; private static void createFile(String html) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; File f = new File("sample.html");&nbsp; &nbsp; &nbsp; &nbsp; BufferedWriter bw = new BufferedWriter(new FileWriter(f));&nbsp; &nbsp; &nbsp; &nbsp; bw.write(html);&nbsp; &nbsp; &nbsp; &nbsp; bw.close();&nbsp; &nbsp; }&nbsp; &nbsp; private static String createHTML(String div1, String div2) {&nbsp; &nbsp; &nbsp; &nbsp; String html = "<html>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<body>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<table border='1'>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<tr>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<th>Existing</th>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<th>New</th>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</tr>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<tr>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<td>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; div1 +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</td>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "<td>" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; div2 +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</td>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</tr>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</table>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</body>" +&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "</html>";&nbsp; &nbsp; &nbsp; &nbsp; return html;&nbsp; &nbsp; }&nbsp; &nbsp; private static String print(List<String> string2Lines, Map<Integer, DataMismatch> mismatch, boolean isExisting) {&nbsp; &nbsp; &nbsp; &nbsp; StringBuilder sb = new StringBuilder();&nbsp; &nbsp; &nbsp; &nbsp; for(int i=0; i<string2Lines.size();i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (mismatch.containsKey(i)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataMismatch data = mismatch.get(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f1Line = data.getFile1Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f2Line = data.getFile2Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("<div>");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] f1Words = f1Line.split(" ");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] f2Words = f2Line.split(" ");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int f1WordSize = f1Words.length;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int f2WordSize = f2Words.length;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int wordLoopLimit = f1WordSize > f2WordSize ? f2WordSize : f1WordSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j < wordLoopLimit; j++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String word = null;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isExisting) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; word = f1Words[j];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; word = f2Words[j];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (data.getMismatchedWords().containsKey(j)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("<span style='background: yellow'>").append(word).append("</span>");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append(word);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append(" ");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("</div>");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sb.append("<div>").append(string2Lines.get(i)).append("</div>");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return sb.toString();&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Method to compare two text containing multiple lines&nbsp; &nbsp; &nbsp;*&nbsp;&nbsp; &nbsp; &nbsp;* @param string1Lines&nbsp; &nbsp; &nbsp;* @param string2Lines&nbsp; &nbsp; &nbsp;* @param regexList&nbsp; &nbsp; &nbsp;* @return&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public static Map<Integer, DataMismatch> compareText(List<String> string1Lines, List<String> string2Lines,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<String> regexList) {&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* List of excluded lines that are different but ignored&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; List<DataMismatch> excludedData = new ArrayList<DataMismatch>();&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Map to store mismatched lines with index/line number&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; Map<Integer, DataMismatch> mismatchdata = new HashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Calculate number of lines&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; int string1Size = string1Lines.size();&nbsp; &nbsp; &nbsp; &nbsp; int string2Size = string2Lines.size();&nbsp; &nbsp; &nbsp; &nbsp; int loopLimit = string1Size > string2Size ? string2Size : string1Size;&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Iterate all lines and find mismatched ones and store in map&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < loopLimit; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f1Line = string1Lines.get(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f2Line = string2Lines.get(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!f1Line.equals(f2Line)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean isEligibleExclude = checkLinesWithRegex(f1Line, f2Line, regexList);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isEligibleExclude) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; excludedData.add(new DataMismatch(f1Line, f2Line));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mismatchdata.put(i, new DataMismatch(f1Line, f2Line));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Iterate through map and check each entry with regex list, if the mismatched&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* lines are matching with regex then it can be ignored&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; for (Entry<Integer, DataMismatch> mimatchedEntry : mismatchdata.entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataMismatch data = mimatchedEntry.getValue();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f1Line = data.getFile1Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f2Line = data.getFile2Text();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] f1Words = f1Line.split(" ");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] f2Words = f2Line.split(" ");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int f1WordSize = f1Words.length;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int f2WordSize = f2Words.length;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int wordLoopLimit = f1WordSize > f2WordSize ? f2WordSize : f1WordSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < wordLoopLimit; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f1Word = f1Words[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String f2Word = f2Words[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!f1Word.equals(f2Word)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean isEligibleExclude = checkLinesWithRegex(f1Word, f2Word, regexList);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!isEligibleExclude) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data.getMismatchedWords().put(i, new DataMismatch(f1Word, f2Word));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Print the output&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Excluded from comparsion data (Matched with regex): " + excludedData);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Mismatched data: " + mismatchdata);&nbsp; &nbsp; &nbsp; &nbsp; return mismatchdata;&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Method to check if the lines match with any of the given input regex list&nbsp; &nbsp; &nbsp;*&nbsp;&nbsp; &nbsp; &nbsp;* @param f1Line&nbsp; &nbsp; &nbsp;* @param f2Line&nbsp; &nbsp; &nbsp;* @param regexList&nbsp; &nbsp; &nbsp;* @return&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; private static boolean checkLinesWithRegex(String f1Line, String f2Line, List<String> regexList) {&nbsp; &nbsp; &nbsp; &nbsp; for (String regex : regexList) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (f1Line.matches(regex) || f2Line.matches(regex)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }}And below class:&nbsp; &nbsp; package base;import java.util.HashMap;import java.util.Map;public class DataMismatch {&nbsp; &nbsp; private String file1Text;&nbsp; &nbsp; private String file2Text;&nbsp; &nbsp; private final Map<Integer, DataMismatch> mismatchedWords;&nbsp; &nbsp; public DataMismatch(String file1Text, String file2Text) {&nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; &nbsp; &nbsp; mismatchedWords = new HashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; this.file1Text = file1Text;&nbsp; &nbsp; &nbsp; &nbsp; this.file2Text = file2Text;&nbsp; &nbsp; }&nbsp; &nbsp; public String getFile1Text() {&nbsp; &nbsp; &nbsp; &nbsp; return file1Text;&nbsp; &nbsp; }&nbsp; &nbsp; public void setFile1Text(String file1Text) {&nbsp; &nbsp; &nbsp; &nbsp; this.file1Text = file1Text;&nbsp; &nbsp; }&nbsp; &nbsp; public String getFile2Text() {&nbsp; &nbsp; &nbsp; &nbsp; return file2Text;&nbsp; &nbsp; }&nbsp; &nbsp; public void setFile2Text(String file2Text) {&nbsp; &nbsp; &nbsp; &nbsp; this.file2Text = file2Text;&nbsp; &nbsp; }&nbsp; &nbsp; public Map<Integer, DataMismatch> getMismatchedWords() {&nbsp; &nbsp; &nbsp; &nbsp; return mismatchedWords;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public String toString() {&nbsp; &nbsp; &nbsp; &nbsp; return "DataMismatch [file1Text=" + file1Text + ", file2Text=" + file2Text + "]";&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java