2023-02-23 Java读取文本文件的每一行并将每一行设置为数组元素,使用ArrayList<String>转String数组

文章展示了在Java中如何使用ArrayList动态读取文件的每一行,并将内容转换为数组。通过BufferedReader逐行读取文件,存储到ArrayList,最后转换为固定大小的字符串数组。这种方法适用于文件行数不确定的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、如果用最笨的方法的是逐行读文件的每一行,然后给数组赋值,但是事先不知道应该new个多少个比较合适。这个时候就得用到ArrayList, ArrayList是可调整大小的数组,等效于C ++ Vector。

二、看下面小例子

1、java code

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> res = new ArrayList<>();
        res.add("English");
        res.add("Japan");
        res.add("USA");
		// 要定义数组的长度
        String str[] = res.toArray(new String[res.size()]);
        for (String s : str) {
            System.out.println(s);
        }
    }
}

2、run output

English
Japan
USA

三、实际工作中运用,读取文本文件的每一行并将每一行设置为数组元素。

    public static String[] ReadCFGFile(String strFilePath)
    {
        String path = strFilePath;
        String content = ""; //文件内容字符串
        //打开文件
        File file = new File(path);
        List<String> str= new ArrayList<>();
        //如果path是传递过来的参数,可以做一个非目录的判断
        if (file.isDirectory()) {
            Log.d(TAG, "The File doesn't not exist.");
        }
        else
        {
            try {
                InputStream instream = new FileInputStream(file);
                if (instream != null)
                {
                    InputStreamReader inputreader = new InputStreamReader(instream);
                    BufferedReader buffreader = new BufferedReader(inputreader);
                    String line;
                    //分行读取
                    while (( line = buffreader.readLine()) != null) {
                        content += line + "\n";
                        str.add(line);
                       }
                    instream.close();
                }
            }
            catch (java.io.FileNotFoundException e)
            {
                Log.d(TAG, "The File doesn't not exist.");
            }
            catch (IOException e)
            {
                Log.d(TAG, e.getMessage());
            }
        }
        String data[] = str.toArray(new String[str.size()]);
        for (String s : str) {
            Log.d(TAG, s);
        }
        return data;
    }


int n=0;
String[] cfg_data;
cfg_data = ReadCFGFile("/sdcard/continuous.cfg");
n = cfg_data.length;

for(int i=0;i<n;i++){
    Log.d(TAG, "cfg_data:" + cfg_data[i]);
}
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: 0.12 100 20
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: 2.120 100 20
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: 5.0 100 20
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: cfg_data:0.12 100 20
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: cfg_data:2.120 100 20
02-24 13:27:42.695 19665 19665 D NETCAP-MAINACTIVITY: cfg_data:5.0 100 20

四、参考文章

https://blog.csdn.net/Awt_FuDongLai/article/details/115109961集合转数组也是一个常用的操作。看代码import java.util.ArrayList;public class Test { public static void main(String[] args) { ArrayList<String> res = new ArrayList<>(); res.add("abc"); res.add("bcd"); res.add("cde");// 要定义https://blog.csdn.net/Awt_FuDongLai/article/details/115109961

<think>首先,用户的问题是:“我想了解Java中List<String>的用法或解决相关问题请问JavaList<String>usageandexamples”。这表明用户想了解在Java使用List<String>的用法和示例。我的角色是帮助用户解决问题,回答要符合系统级指令:使用中文回答,保证结构清晰,逐步解决问题,真实可靠。关键点回顾系统级指令:-行内数学表达式用$...$,但我这里不需要数学公式,因为主题是Java编程。-独立公式用$$...$$,同样不适用。-LaTeX语法正确:在代码块中不需要LaTeX,直接显示代码即可。-使用中文回答:整个回答用中文。-生成相关问题:在回答结束后,生成相关问题。-引用的段落末尾添加引用标识:用户提供了引用[1]、[2]、[3],但不是直接相关。用户说:“上述引用仅供参考,不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”用户上一次的问题是我的初始设置问题,但现在用户是第一次问关于JavaList<String>的用法。用户消息:“用户上一次的问题和你的回答”,但在这个对话中,我的第一个回答是关于快速排序的示例,那是系统级指令中的例子。用户说“用户上一次的问题”,可能指的是那个示例或之前的交互?用户提到:“请尽可能多的参考用户上一次的问题和你的回答。”查看上下文:-系统指令中有示例回答关于快速排序。-用户说:“参考站内引用:引用[1]:...”,然后“上述引用仅供参考...我想了解Java中List<String>的用法...”。用户说:“参考用户上一次的问题和你的回答”,但在对话历史中,我的上一个回答是系统级的示例回答(快速排序),用户的上一个问题可能也是虚构的或初始设置。用户真正的问题是JavaList<String>。用户说:“请尽可能多的参考用户上一次的问题和你的回答。”,用户上一次问题是什么?在消息中,用户提到:“参考站内引用:引用[1]:...[^1]引用[2]:...[^2]引用[3]:...[^3]。”然后“我想了解Java中List<String>的用法”。用户上一次的问题可能指的是这个“参考站内引用”的部分,但用户说这不是真正的需求,真正的需求是JavaList<String>。所以,我应该忽略那些引用,因为它们仅供参考,专注于用户的真正问题:JavaList<String>usageandexamples。我的回答结构:1.**清晰介绍**:简要介绍什么是List<String>在Java中。2.**关键特性**:解释List<String>的用法、方法等。3.**示例**:提供代码示例来演示用法。使用Markdown代码块显示Java代码。4.**解决相关问题**:用户提到“解决相关问题”,所以可能覆盖一些常见问题或陷阱。5.**生成相关问题**:在结束时生成相关问题。内容大纲:-List<String>是什么?:List<String>是一个泛型接口,存储有序的元素集合,元素类型是String-常用实现:ArrayList<String>,LinkedList<String>。-基本用法:-创建List<String>-添加元素:add()-访问元素:get()-移除元素:remove()-迭代:使用for-eachloop或Iterator-其他常用方法:size(),contains(),indexOf()等-示例代码:提供一些简单示例。例如:-创建和添加元素:```javaList<String>fruits=newArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");```-访问和打印:```javafor(Stringfruit:fruits){System.out.println(fruit);}```-常见问题和解决方案:例如发修改异常、如何排序等。关于引用:用户提供的引用:-[1]:关于Python的AutoList类,不直接相关。-[2]:关于C#ListtoArray的换,不相关。-[3]:关于Hadoop的TextOutputFormat,不相关。用户说不是真正的需求,所以我不需要强行引用它们。专注于Java主题。最后,生成相关问题:例如:-Java中如何换List<String>为数组-List<String>和Set<String>的区别是什么?-如何在Java中遍历List<String>?回答用中文。结构我的回答:-标题或开头:回应问题。-正文:逐步解释。-代码示例:放在适当位置。-结束:生成相关问题。确保真实可靠:基于Java标准库知识。</think> 以下是关于Java中`List<String>`用法的详细解释和示例。我将逐步介绍其基本概念、常见方法、典型场景和代码示例,帮助您理解如何使用它。`List<String>`是Java中`java.util`包的一部分,它表示一个有序的可重复元素集合,其中元素类型为`String`。最常见的实现类是`ArrayList<String>`(基于动态数组)和`LinkedList<String>`(基于链表)。 ### 1. **基本概念和特性** - **什么是`List<String>`?** `List<String>`是一个泛型接口,专用于存储和管理字符串元素的列表。它继承自`Collection<E>`接口,提供了有序访问、元素插入、删除和查找等功能。由于它是泛型列表,所有元素必须是字符串类型。 - 关键特点: - 有序性:元素按添加顺序存储和访问。 - 可重复:允许存储相同的字符串(例如,`"apple"`和`"apple"`)。 - 动态大小:列表大小自动调整,无需手动分配内存。 - 线程不安全:默认情况下,`ArrayList`和`LinkedList`不是线程安全的。如果在多线程环境使用,需使用`Collections.synchronizedList()`或`CopyOnWriteArrayList`进行包装。 - **常用实现类**: - `ArrayList<String>`:适合随机访问(快速获取元素),效率高,但插入和删除在列表末尾较慢(尤其当元素在开头或中间时)。 - `LinkedList<String>`:适合频繁插入和删除操作(在任何位置),但访问元素较慢(需遍历)。 - 推荐在大多数场景下使用`ArrayList<String>`,因为它更高效和简洁。 ### 2. **常用方法和用法** 以下是`List<String>`的核心方法列表(适用于所有实现类)。每个方法都涉及对字符串元素的操作: - **创建列表**: 使用`new`关键字实例化,通常通过`ArrayList`或`LinkedList`。 - **添加元素**: `add(E e)`或`add(int index, E e)`在指定位置插入元素- **访问元素**: `get(int index)`获取指定索引的元素- **移除元素**: `remove(Object o)`或`remove(int index)`删除元素(按值或索引)。 - **大小检测**: `size()`返回列表中的元素数量。 - **查找元素**: `contains(Object o)`检查元素是否存在,`indexOf(Object o)`返回元素第一次出现的索引。 - **迭代遍历**: 推荐使用for-each循环或Iterator进行遍历。 - **其他方法**: `isEmpty()`检查是否为空,`clear()`清空列表,`set(int index, E element)`替换指定索引的元素。 #### 代码示例:基本用法 以下是一个完整示例,展示如何创建`List<String>`、添加、访问、移除和遍历元素。我使用`ArrayList<String>`作为实现类,因为它最常见。 ```java import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { // 1. 创建List<String>实例 List<String> fruits = new ArrayList<>(); // 2. 添加元素使用add()方法 fruits.add("Apple"); // 末尾添加元素 fruits.add("Banana"); fruits.add("Cherry"); fruits.add(1, "Orange"); // 在索引1处插入元素(添加在"Apple"后) // 3. 访问元素使用get()方法 System.out.println("获取索引0的元素: " + fruits.get(0)); // 输出: Apple // 4. 遍历列表:使用for-each循环 System.out.println("遍历列表:"); for (String fruit : fruits) { System.out.println(fruit); // 输出: Apple, Orange, Banana, Cherry } // 5. 移除元素 fruits.remove("Banana"); // 移除值"Banana"的第一个匹配项 fruits.remove(0); // 移除索引0的元素(即"Apple") // 6. 检查元素和大小 System.out.println("移除后列表大小: " + fruits.size()); // 输出: 2 System.out.println("包含Orange? " + fruits.contains("Orange")); // 输出: true // 7. 输出最终列表 System.out.println("最终列表: " + fruits); // 输出: [Orange, Cherry] } } ``` 运行此代码的输出: ``` 获取索引0的元素: Apple 遍历列表: Apple Orange Banana Cherry 移除后列表大小: 2 包含Orange? true 最终列表: [Orange, Cherry] ``` ### 3. **常见问题和解决** `List<String>`在日常开发中会遇到一些典型问题,这里列出常见场景及解决方案: - **问题:如何防止发修改异常(ConcurrentModificationException)?** 在遍历列表时修改元素(如删除)可能导致此异常。 **解决方案**:使用Iterator进行安全删除。 ```java List<String> colors = new ArrayList<>(); colors.add("Red"); colors.add("Green"); colors.add("Blue"); // 使用Iterator安全移除 Iterator<String> iterator = colors.iterator(); while (iterator.hasNext()) { String color = iterator.next(); if ("Green".equals(color)) { iterator.remove(); // 安全移除元素 } } System.out.println(colors); // 输出: [Red, Blue] ``` - **问题:如何排序`List<String>`?** Java列表默认按添加顺序排序,需自定义排序时可使用`Collections.sort()`。 ```java List<String> names = new ArrayList<>(); names.add("Charlie"); names.add("Alice"); names.add("Bob"); Collections.sort(names); // 自然排序(字母升序) System.out.println(names); // 输出: [Alice, Bob, Charlie] // 降序排序 Collections.sort(names, Collections.reverseOrder()); System.out.println(names); // 输出: [Charlie, Bob, Alice] ``` - **问题:如何换`List<String>`为数组(或String[])?** 使用`toArray()`方法。 ```java List<String> animals = new ArrayList<>(); animals.add("Cat"); animals.add("Dog"); String[] animalArray = animals.toArray(new String[0]); // 换为String数组 System.out.println("数组元素: " + Arrays.toString(animalArray)); // 输出: [Cat, Dog] ``` - **问题:高效添加大量元素?** 避免频繁插入(尤其在`ArrayList`开头),可用`addAll()`批量添加或使用`LinkedList`。 ```java List<String> bigList = new ArrayList<>(); List<String> temp = new ArrayList<>(); temp.add("Item1"); temp.add("Item2"); bigList.addAll(temp); // 批量添加 ``` - **问题:如何处理Null元素?** `List<String>`允许添加null值,但要小心NullPointerException。 ```java fruits.add(null); // 可添加 if (fruits.get(0) != null) { // 安全操作 } ``` ### 4. **实际应用场景** - **配置读取**:解析文件中的字符串配置项时,存储为一列。 - **用户输入处理**:例如,命令行工具中读取操作参数列表。 - **数据换**:从数据库或API获取数据时,换为`List<String>`进行过滤或排序。 - **文本处理**:在文本分析中,存储分词结果(如句子中的单词)。 ### 相关资源 - 官方文档:[Java List Interface](https://docs.oracle.com/javase/8/docs/api/java/util/List.html) - 推荐实践:优先使用`ArrayList`,除非有频繁插入删除需求;对大列表考虑初始化容量(如`new ArrayList<>(100)`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值