V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NanFengXiangWan
V2EX  ›  程序员

求解一道 Java 练习题,请喝一杯星巴克 o(╥﹏╥)o

  •  
  •   NanFengXiangWan · 2022-12-30 18:22:41 +08:00 · 2841 次点击
    这是一个创建于 671 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2022-12-30 19:18:17 +08:00
    下载地址: https://cowtransfer.com/s/b98c8bccb74f45 口令:68wyp2
    28 条回复    2023-01-06 11:06:01 +08:00
    sunjiayao
        1
    sunjiayao  
       2022-12-30 18:28:55 +08:00   ❤️ 1
    自己做
    yumenawei
        2
    yumenawei  
       2022-12-30 18:30:07 +08:00   ❤️ 1
    哪个学校?这题挺有意思。
    给个提示,百度搜下面两个工具类怎么使用。
    FileInputStream
    FileOutputStream
    FurryR
        3
    FurryR  
       2022-12-30 18:32:19 +08:00
    可以试着读取 p1 p2 p3 用 FileInputStream ,splitlog.txt 用 BufferedReader 看看。
    并不算一道很难的题目,不过我对 Java 了解不多,不能提供什么帮助。
    sunjiayao
        4
    sunjiayao  
       2022-12-30 18:41:21 +08:00



    试了下并不难,参考 #2 的提示自己想想。
    sunjiayao
        5
    sunjiayao  
       2022-12-30 18:43:38 +08:00   ❤️ 1
    zchzch1014
        6
    zchzch1014  
       2022-12-30 18:52:49 +08:00
    我试了一下用 ChatGPT 可以直接生成代码,自己稍改一下就可以用
    passer9527
        7
    passer9527  
       2022-12-30 18:56:43 +08:00 via iPhone
    这个挺有意思,我想知道还原后的图片是啥
    PTLin
        8
    PTLin  
       2022-12-30 19:05:36 +08:00
    不会 java ,闲的用 rust 写了一个。

    ```rust
    use std::{
    error::Error,
    fs::File,
    io::{Read, Write},
    };
    fn main() {
    run().unwrap();
    }
    fn run() -> Result<(), Box<dyn Error>> {
    let mut out = File::create("out.jpg")?;
    let mut files = [
    File::open("files/p1")?,
    File::open("files/p2")?,
    File::open("files/p3")?,
    ];
    let mut buffer = vec![0; 255];
    let log = std::fs::read_to_string("files/splitlog.txt")?;
    for (l, r) in log.lines().map(|line| {
    let mut s = line.split('\t');
    let l: usize = s.next().unwrap().parse().unwrap();
    let r: usize = s.next().unwrap().parse().unwrap();
    (l, r)
    }) {
    let file = &mut files[l];
    let buffer = &mut buffer[..r];
    file.read_exact(buffer)?;
    out.write_all(buffer)?;
    }

    Ok(())
    }
    ```
    ysc3839
        9
    ysc3839  
       2022-12-30 19:13:13 +08:00
    顺手用 C 写了个
    ```
    #include <stdio.h>

    int main()
    {
    FILE* f = fopen("splitlog.txt", "r");

    FILE* p[3];
    p[0] = fopen("p1", "rb");
    p[1] = fopen("p2", "rb");
    p[2] = fopen("p3", "rb");

    FILE* o = fopen("out", "wb");

    while (1)
    {
    int n = fgetc(f);
    if (n != '0' && n != '1' && n != '2')
    break;
    n -= '0';

    int t = fgetc(f);
    if (t != '\t')
    break;

    unsigned char len = 0;
    for (size_t i = 0; i < 4; ++i)
    {
    int c = fgetc(f);
    if ('0' <= c && c <= '9')
    {
    c -= '0';
    len *= 10;
    len += c;
    }
    else
    {
    char buf[255];
    fread(buf, 1, len, p[n]);
    fwrite(buf, 1, len, o);
    break;
    }
    }
    }
    }
    ```
    yangcao1122
        10
    yangcao1122  
       2022-12-30 19:13:33 +08:00
    下载不了
    NanFengXiangWan
        11
    NanFengXiangWan  
    OP
       2022-12-30 19:18:33 +08:00
    @yangcao1122 #10 下载地址: https://cowtransfer.com/s/b98c8bccb74f45 口令:68wyp2
    yangcao1122
        12
    yangcao1122  
       2022-12-30 19:42:59 +08:00
    确定合成的图片能打开吗?
    KevinBlandy
        13
    KevinBlandy  
       2022-12-30 20:12:16 +08:00
    我尝试用 Java 写了一个,还包含了文件的随机切割和日志文件的生成。

    https://springboot.io/t/topic/5065

    你也许可以看看,我也不知道有问题没。
    passer9527
        14
    passer9527  
       2022-12-30 20:52:46 +08:00
    import java.io.*;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;


    public class Main {

    public static void main(String[] args) throws IOException {
    String path = "/Users/ssss/Downloads/Files (1)/";

    List<String> lines = Files.readAllLines(Path.of(path + "splitlog.txt"));

    Map<Integer, InputStream> inputMap = new HashMap(){{
    put(0, new FileInputStream(path + "p1"));
    put(1, new FileInputStream(path + "p2"));
    put(2, new FileInputStream(path + "p3"));
    }};


    OutputStream out = new FileOutputStream(path + "out.jpg");

    for (String line : lines) {
    String[] tmps = line.split("\t");

    int fileN = Integer.parseInt(tmps[0]);
    int byteN = Integer.parseInt(tmps[1]);

    out.write(inputMap.get(fileN).readNBytes(byteN));
    }
    out.close();
    }
    }
    passer9527
        15
    passer9527  
       2022-12-30 20:53:27 +08:00
    @passer9527 我用的 java17
    NanFengXiangWan
        16
    NanFengXiangWan  
    OP
       2022-12-30 21:59:27 +08:00
    @passer9527 #14 老兄请问您有本地测试过么
    zhaogaz
        17
    zhaogaz  
       2022-12-30 22:03:42 +08:00
    这不就是操作流读么
    为啥会搞不定,
    你说问题,我们解决问题,不要直接要结果。。提升不了的。。。
    NanFengXiangWan
        18
    NanFengXiangWan  
    OP
       2022-12-30 22:04:21 +08:00
    @KevinBlandy #13 老兄我是 Java8 的环境,运行时:
    java: 无法将类 java.util.Random 中的方法 nextLong 应用到给定类型;
    需要: 没有参数
    找到: int,long
    原因: 实际参数列表和形式参数列表长度不同
    NanFengXiangWan
        19
    NanFengXiangWan  
    OP
       2022-12-30 22:05:42 +08:00
    @zhaogaz #17 这道题实在弄不明白,想参考下 V 友给的答案 o(╥﹏╥)o
    passer9527
        20
    passer9527  
       2022-12-30 22:20:18 +08:00
    @NanFengXiangWan 本地成功了,java17
    NanFengXiangWan
        21
    NanFengXiangWan  
    OP
       2022-12-30 22:32:18 +08:00
    @passer9527 #20 我现在用的 Java8 等我装个 Java17 试试,请问方便截个图么
    passer9527
        22
    passer9527  
       2022-12-30 22:39:57 +08:00
    @NanFengXiangWan 结果的图片,上面有人发了: https://imgur.com/4dfEeDh


    学习的话,没必要用 10 年前的 java8 ,直接上 17
    KevinBlandy
        23
    KevinBlandy  
       2022-12-31 09:26:16 +08:00
    @NanFengXiangWan 我这是 JDK17 。
    keshao
        24
    keshao  
       2022-12-31 10:01:59 +08:00
    @KevinBlandy 老哥这个域名 666
    msg7086
        25
    msg7086  
       2022-12-31 13:52:44 +08:00
    闲得用 Ruby 写了一个。

    src = ['p1', 'p2', 'p3']
    log = 'splitlog.txt'
    src_data = src.map {|fn| File.open(fn, 'rb')}
    output = ''
    File.readlines(log).each do |line|
    idx, len = line.rstrip.split(' ')
    output += src_data[idx.to_i].read(len.to_i)
    end
    src_data.map(&:close)
    File.binwrite('out.jpg', output)
    levelworm
        26
    levelworm  
       2022-12-31 19:28:42 +08:00 via Android
    @NanFengXiangWan 思路不知道有没有?

    大致上就是这样,首先要按行读入 txt 文件,且需要将每一行分解成两个元素。接下来要读入图片文件然后分解成一个个小文件。
    huangzhe8263
        27
    huangzhe8263  
       2023-01-02 09:46:53 +08:00
    这个不难啊,典型的面向 API 编程的题
    点进来前我还以为是什么算法题
    vdrapb
        28
    vdrapb  
       2023-01-06 11:06:01 +08:00
    你如果是 java8 的,你把 passer9527 这位老哥的代码改造一下就可以了

    // 题目要求
    int singleMaxSize = 255;

    // DIR 就是存放 p1, p2, p3 的目录
    Path logPath = DIR.resolve("splitlog.txt");

    Path jpgPath = DIR.resolve("photo.jpg");

    Map<String, InputStream> inputStreamMap = new HashMap<String, InputStream>(){
    private static final long serialVersionUID = 1L;
    {
    put("0", Files.newInputStream(DIR.resolve("p1")));
    put("1", Files.newInputStream(DIR.resolve("p2")));
    put("2", Files.newInputStream(DIR.resolve("p3")));
    }};

    List<String> list = Files.readAllLines(logPath);
    try (OutputStream outputStream = Files.newOutputStream(jpgPath, StandardOpenOption.CREATE)){
    list.forEach(line ->{
    String[] split = line.split("\t");

    String index = split[0];

    int size = Integer.parseInt(split[1]);

    byte[] bytes = new byte[Math.min(size, singleMaxSize)];

    try {
    if(inputStreamMap.get(index).read(bytes) > 0){
    outputStream.write(bytes);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    });
    }
    inputStreamMap.values().forEach(input ->{
    try {
    input.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    });
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:34 · PVG 08:34 · LAX 17:34 · JFK 20:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.