求解一道 Java 练习题,请喝一杯星巴克 o()o - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
NanFengXiangWan
V2EX    程序员

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

  •  
  •   NanFengXiangWan 2022-12-30 18:22:41 +08:00 3380 次点击
    这是一个创建于 1024 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言    2022-12-30 19:18:17 +08:00
    下载地址: https://cowtransfer.com/s/b98c8bccb74f45 口令:68wyp2
    28 条回复    2023-01-06 11:06:01 +08:00
    luman
        1
    luman  
       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 了解不多,不能提供什么帮助。
    luman
        4
    luman  
       2022-12-30 18:41:21 +08:00



    试了下并不难,参考 #2 的提示自己想想。
    luman
        5
    luman  
       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     Solana     3940 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 05:18 PVG 13:18 LAX 22:18 JFK 01:18
    Do have faith in what yu're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86