java 如何读入 指定.java或.c文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 如何读入 指定.java或.c文件相关的知识,希望对你有一定的参考价值。

java 如何读入 指定.java或.c文件
然后输出 为网页文件~~
还有关键字需要染色

请问如何实现?
提供一下思路或者方法..无头绪- -
唔唔..还是没看懂..

 
 
 
正如楼上几位提到的,你可以用正则表达式。
如果不用正则表达式,对代码里的注释和字符串的处理会比较麻烦。
以下的代码供参考:

import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import java.io.*;

class C
    static final String COMMON =    // C 和 Java 共有的关键词
            "break case char const continue default do double else enum float for " +
            "goto if int long return short static switch void volatile while ";
    static final String[]
            C =     (COMMON +       // C 的关键词
            "auto extern register signed sizeof struct typedef union unsigned").split(" "),
            JAVA =  (COMMON +       // JAVA 的关键词
            "abstract assert boolean byte catch class extends final finally implements " +
            "import instanceof interface native new package private protected public " +
            "strictfp super synchronized this throw throws transient try").split(" ");

    public static void main(String[] args) throws Exception
        JFileChooser jfc = new JFileChooser(".");
        if (jfc.showDialog(null, "打开 C 或 Java 文件") == JFileChooser.APPROVE_OPTION)
            String inputFileName = jfc.getSelectedFile().getName();
            String[] keywords = inputFileName.toUpperCase().endsWith(".C") ? C : JAVA;
            String source = new Scanner(new File(inputFileName)).
                    // 把 "\\Z" 设为分隔模式后,nex() 返回的字符串是整个文件内容
                    useDelimiter("\\Z").next().
                    // 替换可能对 html 的显示造成破坏的字符
                    replaceAll("&", "&amp;").replaceAll("<", "&lt;");

            // 只要源码里有任何字符串或注释,以下的 for 循环就会进行处理。
            // 每一次循环 processed 就会累积多一段处理过的源码和没处理过的字符串或注释。
            // 累积所有源码和紧跟在后的字符串或注释后,循环即终止。
            String processed = "";
            int codeStart = 0;
            Pattern p = Pattern.compile("(\".*?\"|/\\*.*?\\*/|//.*?\n)", Pattern.DOTALL);
            for (Matcher commentOrString = p.matcher(source); commentOrString.find(); )
                int cosStart = commentOrString.start();
                processed += highlight(keywords, source.substring(codeStart, cosStart)) +
                        source.substring(cosStart, commentOrString.end());
                codeStart = commentOrString.end();
            

            // 如果至此 processed 还是空的,则源代码里没有任何字符串或注释,
            if (processed.equals(""))
                // 所以可以一次过处理整个文件
                source = highlight(keywords, source);
            else
                // 否则就必须处理以上 for 循环不能处理的可能存在于源码里的最后一段源码
                source = processed + highlight(keywords, source.substring(codeStart));

            // 最后的 HTML 包装,以及输出文件(名为源码文件名加 ".html" 后辍)的创建。
            source = "<html><body><pre>" + source + "</pre></body></html>";
            FileWriter fw = new FileWriter(new File(inputFileName + ".html"));
            fw.write(source);
            fw.close();
        
    

    // 对 toBeHighlighted 里所有能在 keywords 里找得到的关键字进行 HTML 上色后返回结果
    static String highlight(String[] keywords, String toBeHighlighted)
        for (String keyword: keywords)
            toBeHighlighted = toBeHighlighted.replaceAll("\\b(" + keyword + ")\\b",
                    "<font color='blue'><b>$0</b></font>");
        return toBeHighlighted;
    

 
 
 
参考技术A 这样很简单呀,用BufferedReader来读
每次读一行,用正则表达式来替换关键字(JAVA和C的关键字都不多了)然后append到StringBuffer去然后输出
这里最难的是怎么把 制表符输出(\t)因为
\t不是HTML的特殊符号。现在最常用的是用“<pre>\t</pre>”这个代替"\t"
不过这样还不够灵活,一般是直接输出源代码用javascript来处理输出,这样既节省了Server的运算量,在网页中也方便获得源码;
参考技术B 解析读取的文件内容
碰到关键字就加<font color="red"></font>标记,用StringBuffer拼装成字符串,最后写入到html文件中
参考技术C java和c源文件都是纯文本的,读取应该没有问题吧?使用FileReader和RandomAccessFile都可以实现的。
生成Html文件时,
方法一:读出来的文本你需要做一个分析器,将源程序划分为关键字、符号、标识符等。产生一个Html文件只需要换Html格式把文档、关键字、标识符加适当的标签就可以。难点是语法分析器。
方法二:读出来的字符串使用正则表达式将关键字替换为带有颜色的Html标签和关键字。
参考技术D StringBuilder缓存读取字符串,然后indexof,在前面插入格式html标签就可以了。

Java将文件读入ArrayList?

【中文标题】Java将文件读入ArrayList?【英文标题】:Java reading a file into an ArrayList? 【发布时间】:2011-03-17 18:42:23 【问题描述】:

如何在 Java 中将文件内容读入ArrayList&lt;String&gt;

以下是文件内容:

cat
house
dog
.
.
.

只需将每个单词读入ArrayList

【问题讨论】:

【参考方案1】:

这段 Java 代码读入每个单词并将其放入 ArrayList:

Scanner s = new Scanner(new File("filepath"));
ArrayList<String> list = new ArrayList<String>();
while (s.hasNext())
    list.add(s.next());

s.close();

如果您想逐行而不是逐字阅读,请使用s.hasNextLine()s.nextLine()

【讨论】:

哦,很好,ScannerBufferedReader 更短,并且没有例外需要处理。我想我已经习惯了在 Java 5 之前使用 BufferedReaderScanner 不存在,尽管我已经使用 Java 5 和 6 很多年了。 Commons IO 库当然会提供最短的答案(如果其他人提到的),所以我现在通常使用它。 您不需要为扫描仪指定分隔符,因为默认分隔符与空格匹配吗?即 new Scanner(new File("filepath")).useDelimiter("\n"); @Hedley from java7 on new Scanner(new File("filepath")).useDelimiter(System.lineSeparator()) 因为每个操作系统可能不同【参考方案2】:

你可以使用:

List<String> list = Files.readAllLines(new File("input.txt").toPath(), Charset.defaultCharset() );

来源:Java API 7.0

【讨论】:

我会在这里使用特定的字符集,而不是依赖当前平台的字符集。 你也可以用Paths.get("input.txt")代替new File("input.txt").toPath(0【参考方案3】:

与commons-io 的单线:

List<String> lines = FileUtils.readLines(new File("/path/to/file.txt"), "utf-8");

同guava:

List<String> lines = 
     Files.readLines(new File("/path/to/file.txt"), Charset.forName("utf-8"));

【讨论】:

为什么不用Charsets.UTF_8 而不是forName【参考方案4】:

我发现的最简单的形式是......

List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));

【讨论】:

【参考方案5】:

Java 8 中,您可以使用流和Files.lines

List<String> list = null;
try (Stream<String> lines = Files.lines(myPathToTheFile))) 
    list = lines.collect(Collectors.toList());
 catch (IOException e) 
    LOGGER.error("Failed to load file.", e);

或者作为一个函数,包括从文件系统加载文件:

private List<String> loadFile() 
    List<String> list = null;
    URI uri = null;

    try 
        uri = ClassLoader.getSystemResource("example.txt").toURI();
     catch (URISyntaxException e) 
        LOGGER.error("Failed to load file.", e);
    

    try (Stream<String> lines = Files.lines(Paths.get(uri))) 
        list = lines.collect(Collectors.toList());
     catch (IOException e) 
        LOGGER.error("Failed to load file.", e);
    
    return list;

【讨论】:

List&lt;String&gt; lines = Files.lines(Paths.get("./input.txt")).collect(Collectors.toList());【参考方案6】:
List<String> words = new ArrayList<String>();
BufferedReader reader = new BufferedReader(new FileReader("words.txt"));
String line;
while ((line = reader.readLine()) != null) 
    words.add(line);

reader.close();

【讨论】:

为什么我用“line.size()”找不到arraylist的大小?【参考方案7】:

例如,您可以通过这种方式执行此操作(包含异常处理的完整代码):

BufferedReader in = null;
List<String> myList = new ArrayList<String>();
try    
    in = new BufferedReader(new FileReader("myfile.txt"));
    String str;
    while ((str = in.readLine()) != null) 
        myList.add(str);
    
 catch (FileNotFoundException e) 
    e.printStackTrace();
 catch (IOException e) 
    e.printStackTrace();
 finally 
    if (in != null) 
        in.close();
    

【讨论】:

在 Java 7+ 中,您可以使用 try-with-resources【参考方案8】:
//CS124 HW6 Wikipedia Relation Extraction
//Alan Joyce (ajoyce)
public List<String> addWives(String fileName) 
    List<String> wives = new ArrayList<String>();
    try 
        BufferedReader input = new BufferedReader(new FileReader(fileName));
        // for each line
        for(String line = input.readLine(); line != null; line = input.readLine()) 
            wives.add(line);
        
        input.close();
     catch(IOException e) 
        e.printStackTrace();
        System.exit(1);
        return null;
    
    return wives;

【讨论】:

【参考方案9】:

这是一个对我来说效果很好的解决方案:

List<String> lines = Arrays.asList(
    new Scanner(new File(file)).useDelimiter("\\Z").next().split("\\r?\\n")
);

如果你不想要空行,你也可以这样做:

List<String> lines = Arrays.asList(
    new Scanner(new File(file)).useDelimiter("\\Z").next().split("[\\r\\n]+")
);

【讨论】:

【参考方案10】:

分享一些分析信息。通过一个简单的测试,读取大约 1180 行值需要多长时间。

如果您需要非常快速地读取数据,请使用旧的 BufferedReader FileReader 示例。我花了~8ms

扫描仪要慢得多。花了我大约 138 毫秒

漂亮的 Java 8 Files.lines(...) 是最慢的版本。花了我大约 388 毫秒。

【讨论】:

【参考方案11】:

这是一个完整的程序示例:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class X 
    public static void main(String[] args) 
    File f = new File("D:/projects/eric/eclipseworkspace/testing2/usernames.txt");
        try
            ArrayList<String> lines = get_arraylist_from_file(f);
            for(int x = 0; x < lines.size(); x++)
                System.out.println(lines.get(x));
            
        
        catch(Exception e)
            e.printStackTrace();
        
        System.out.println("done");

    
    public static ArrayList<String> get_arraylist_from_file(File f) 
        throws FileNotFoundException 
        Scanner s;
        ArrayList<String> list = new ArrayList<String>();
        s = new Scanner(f);
        while (s.hasNext()) 
            list.add(s.next());
        
        s.close();
        return list;
    

【讨论】:

【参考方案12】:
    Scanner scr = new Scanner(new File(filePathInString));
/*Above line for scanning data from file*/

    enter code here

ArrayList<DataType> list = new ArrayList<DateType>();
/*this is a object of arraylist which in data will store after scan*/

while (scr.hasNext())

list.add(scr.next()); /*上面的代码负责通过add函数在arraylist中添加数据*/

【讨论】:

【参考方案13】:

添加此代码以对文本文件中的数据进行排序。 Collections.sort(list);

【讨论】:

一般来说,答案如果包含对代码用途的解释会更有用。

以上是关于java 如何读入 指定.java或.c文件的主要内容,如果未能解决你的问题,请参考以下文章

如何用JAVA NIO读取文件的指定内容?

java如何按空格读入文件内容

java文件读写

java文件读取指定内容

Java读入文件解析输出Map

java中如何在文件中修改某行信息